GithubHelp home page GithubHelp logo

amrex-microelectronics / ferrox Goto Github PK

View Code? Open in Web Editor NEW
7.0 3.0 8.0 38.72 MB

FerroX is a massively parallel, 3D phase-field simulation framework for modeling ferroelectric materials based scalable logic devices.

CMake 0.17% Makefile 0.43% C++ 99.04% C 0.35%

ferrox's Issues

Make Applied voltage a function of time

To perform an applied voltage sweep with a given temporal profile, we need to make applied voltage a function of time.

Currently, we have input parameters inc_step and Phi_Bc_inc to increment the applied voltage at step = inc_step by Phi_Bc_inc. This gives us an option to either increase the applied voltage or decrease it (by setting Phi_Bc_inc < 0).

This could be done with a parser function.

Parser functions would be useful in other instances, such as, defining the device geometry and specifying material properties which depend on spatial locations (x,y,z).

Calculation of Ez from phi seems inaccurate

The calculation of Ez from phi currently uses first order one-sided derivatives at the top and bottom electrodes.
This seems not accurate enough.
We can call the new implemented kernel Dphi/Dz, which uses the second order derivative at the top and bottom electrodes.

In the code, this lines should be implemented:
Ez_arr(i,j,k) = - DphiDz(phi, z, z_hi, z_lo, prob_lo, prob_hi, Phi_Bc_hi, Phi_Bc_lo, i, j, k, dx);
in replacement of the current

if(z_lo < prob_lo[2]){ //Bottom Boundary
Ez_arr(i,j,k) = -(phi(i,j,k+1) - phi(i,j,k))/(dx[2]);
} else if (z_hi > prob_hi[2]){ //Top Boundary
Ez_arr(i,j,k) = -(phi(i,j,k) - phi(i,j,k-1))/(dx[2]);
} else{ //inside
Ez_arr(i,j,k) = -(phi(i,j,k+1) - phi(i,j,k-1))/(2.*dx[2]);
}

Iterative scheme for MFIS simulation does not converge when applied voltage is high

For problems containing ferroelectric, dielectric, and semiconductor layers we compute self-consistent rho and phi using an iterative scheme to achieve true first or second order accuracy. Without this scheme rho computation is done using phi at the previous time step which reduces the overall order of accuracy.

When the Dirichlet BC for Poisson solve is set to Phi_BC_lo = 0.0 and Phi_BC_hi = 1.2 to get an applied voltage of 1.2V across the MFIS stack, the iterative scheme does not converge. The error oscillates between two values rather than going down below a user specified tolerance which is set to be 1.0e-5.

The issue can be reproduced using the following script.

n_cell = 64 64 32

max_grid_size = 32

prob_type = 2

P_BC_flag_lo = 0 # Polarization BC at FE-DE interface
P_BC_flag_hi = 1 # Polarization BC at FE-Metal interface

Phi_Bc_lo = 0.0  # Dirichlet BC for Poisson solve at bottom metal contact
Phi_Bc_hi = 1.2   # Dirichlet BC for Poisson solve at top metal contact

TimeIntegratorOrder = 1

nsteps = 1
plot_int = 1

dt = 2.0e-13

prob_lo = -16.e-9 -16.e-9 0.e-9
prob_hi =  16.e-9  16.e-9 16.e-9

epsilon_0 = 8.85e-12
epsilonX_fe = 24.0
epsilonZ_fe = 24.0
epsilon_de = 3.9
epsilon_si = 11.7
alpha = -2.5e9
beta = 6.0e10
gamma = 1.5e11
BigGamma = 100
g11 = 1.0e-9
g44 = 1.0e-9

SC_lo = 0.0
SC_hi = 10.0e-9
DE_lo = 10.0e-9
DE_hi = 11.0e-9
FE_lo = 11.0e-9
FE_hi = 16.0e-9

lambda = 3.0e-9

Make polarization a three component vector

Currently, we assume the ferroelectric to have uniaxial atomic displacement along the thickness of the film. This allows us to treat polarization as a scalar (Px = 0, Py = 0, Pz = P). In order to simulate general ferroelectrics, we would like to have non-zero Px and Py.

This can be done in the following way:

  1. Initialize a three component MultiFab for P
  2. Modify the RHS of Poisson solve to read div(P) - rho instead of 'dP/dz'
  3. Modify the RHS of TDGL equation to account for all three components
  4. Update time integrator loop to advance Px, Py, and Pz
  5. Add diagnostics for all three components

Note that, we will have to pass new material parameters for Landau free energy term. We should consider renaming the parameters to alpha_* etc instead of alpha, beta, and gamma.

We can use the following paper as a reference:
https://aip.scitation.org/doi/pdf/10.1063/1.1377855

Create namespace

The parameters read in from parmparse should be moved into a namespace, so they don't have to be passed around as function arguments anymore and are "globally accessible" via a header file.

Installation issues

Cloning into 'amrex'...
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.