Exemple #1
0
code_recompute_conductivity = """
double len2_J, sprod_HJ, cos2;
double len2_H=H_x*H_x+H_y*H_y;

len2_J=J(0)*J(0)+J(1)*J(1);
sprod_HJ=H_x*J(0)+H_y*J(1);

cos2=(fabs(len2_J)<1e-8)?0.0:(sprod_HJ*sprod_HJ/(len2_H*len2_J));
sigma = sigma0 + alpha * cos2;
/* printf(\"cos2=%f sigma = %8.6f\\n \",cos2, sigma); */
"""

recompute_conductivity = nfem2.site_wise_applicator(
    parameter_names=["H_x", "H_y", "sigma0", "alpha"],
    # all the names of extra parameters
    code=code_recompute_conductivity,
    field_mwes=[mwe_sigma, mwe_J])

# computing the total current through the sample:

code_integrate_div_J = """
if(coords(1)>2.45)
{
  total_current_up+=drho_by_dt;
}
else if(coords(1)<-2.45)
{
  total_current_down+=drho_by_dt;
}
else
code_recompute_conductivity = """
double len2_J, sprod_MJ, cos2;
double len2_M=M(0)*M(0)+M(1)*M(1);

len2_J=J(0)*J(0)+J(1)*J(1);
sprod_MJ=M(0)*J(0)+M(1)*J(1);

cos2=(fabs(len2_J)<1e-8)?0.0:(sprod_MJ*sprod_MJ/(len2_M*len2_J));
sigma = sigma0/(1 + alpha * cos2);
/* printf(\"cos2=%f sigma = %8.6f\\n \",cos2, sigma); */
"""

recompute_conductivity = nfem2.site_wise_applicator(
    parameter_names=["sigma0", "alpha"],
    # all the names of extra parameters
    code=code_recompute_conductivity,
    field_mwes=[mwe_sigma, mwe_J, mwe_M],
)

# computing the total current through the sample:

code_integrate_div_J = """
if(coords(1)>2048.0)
{
total_current_up+=drho_by_dt;
}
else if(coords(1)<1052.0)
{
total_current_down+=drho_by_dt;
}
else
            def constant_current(voltage):

                # Dirichlet Boundary Conditions on our sample:

                def laplace_dbc(coords):

                    #                 top contact                     bottom contact
                    if (coords[1] > 990.0
                            and coords[0] > 420.0) or (coords[1] < -40.0):
                        return 1
                    else:
                        return 0

                def laplace_dbc_values(dof_name_indices, coords):
                    if (coords[1] > 500.0
                        ):  # greater or smaller than 1/2height of the sample
                        return voltage
                    else:
                        return 0.0

                prematrix_laplace = nfem2.prematrix(diffop_laplace,
                                                    mwe_drho_by_dt,
                                                    mwe_phi,
                                                    mwe_mid=mwe_sigma)

                prematrix_J = nfem2.prematrix(diffop_J,
                                              mwe_J,
                                              mwe_phi,
                                              mwe_mid=mwe_sigma)

                code_recompute_conductivity = """
                if(have_sigma_Py)
                {
                 double len2_J, sprod_MJ, cos2;
                 double len2_M=M(0)*M(0)+M(1)*M(1)+M(2)*M(2);

                 len2_J=J(0)*J(0)+J(1)*J(1)+J(2)*J(2);
                 sprod_MJ=M(0)*J(0)+M(1)*J(1)+M(2)*J(2);

                 cos2=(fabs(len2_J)<1e-8)?0.0:(sprod_MJ*sprod_MJ/(len2_M*len2_J));
                 sigma_Py = sigma0_Py /( 1. + alpha * cos2);
                }
                /* printf(\"cos2=%f sigma = %8.6f\\n \",cos2, sigma); */
                """

                recompute_conductivity = nfem2.site_wise_applicator(
                    parameter_names=["sigma0_Py", "sigma0_Au", "alpha"],
                    # all the names of extra parameters
                    code=code_recompute_conductivity,
                    field_mwes=[mwe_sigma, mwe_J, mwe_M])

                # computing the total current through the sample:

                code_integrate_div_J = """
                if(coords(1)>990.0 && coords(0)>420.0)
                {
                total_current_up+=drho_by_dt;
                }
                else if(coords(1)<-40.0)
                {
                total_current_down+=drho_by_dt;
                }
                else
                {
                double j=drho_by_dt;

                if(j>0)total_bad_current_plus+=j;
                else   total_bad_current_minus+=j;
                }
                """

                accumulate_J_total = nfem2.site_wise_applicator(
                    parameter_names=[
                        "total_current_up", "total_current_down",
                        "total_bad_current_plus", "total_bad_current_minus"
                    ],
                    code=code_integrate_div_J,
                    position_name="coords",
                    cofield_mwes=[mwe_drho_by_dt])

                def update_sigma(the_field_sigma, i):
                    compute_J = nfem2.prematrix_applicator(
                        prematrix_J, field_mid=the_field_sigma)
                    laplace_solver = nfem2.laplace_solver(
                        prematrix_laplace,
                        dirichlet_bcs=[(-1, 4, laplace_dbc),
                                       (-1, 6, laplace_dbc)],
                        mwe_mid=the_field_sigma)
                    cofield_drho_by_dt = nfem2.make_cofield(mwe_drho_by_dt)
                    #
                    field_phi = laplace_solver(cofield_drho_by_dt,
                                               dbc_values=laplace_dbc_values)

                    field_J = nfem2.cofield_to_field(compute_J(field_phi))

                    # Next, let us compute the new condictivity by site-wise operation on
                    # field_J. We just overwrite field_sigma:
                    recompute_conductivity(
                        [sigma0_Py, sigma0_Au, alpha],
                        fields=[the_field_sigma, field_J, field_m])

                    return the_field_sigma

                def compute_total_current(the_field_sigma):

                    laplace_solver = nfem2.laplace_solver(
                        prematrix_laplace,
                        # boundary conditions are defined on objects 4 and 6
                        dirichlet_bcs=[(-1, 4, laplace_dbc),
                                       (-1, 6, laplace_dbc)],
                        mwe_mid=the_field_sigma)
                    compute_div_J = nfem2.prematrix_applicator(
                        prematrix_laplace, field_mid=the_field_sigma)

                    cofield_drho_by_dt = nfem2.make_cofield(mwe_drho_by_dt)

                    field_phi = laplace_solver(cofield_drho_by_dt,
                                               dbc_values=laplace_dbc_values)

                    compute_J = nfem2.prematrix_applicator(
                        prematrix_J, field_mid=the_field_sigma)

                    field_J = nfem2.cofield_to_field(compute_J(field_phi))

                    cofield_div_J = compute_div_J(field_phi)

                    field_div_J = nfem2.cofield_to_field(cofield_div_J)
                    current = accumulate_J_total([0.0, 0.0, 0.0, 0.0],
                                                 cofields=[cofield_div_J])

                    return current, field_phi, the_field_sigma, field_J

                global field_m
                global field_sigma
                # Later on, we will modify this fields:
                field_sigma = None
                field_m = None

                ocaml.sys_check_heap()

                field_sigma = nfem2.make_field(mwe_sigma, fun_sigma0)
                ##        print "#######################################"
                ##        print "##          FIRST BATCH  SIGMA       ##"
                ##        print "#######################################"
                ##        nfem2.field_print_contents(field_sigma)

                field_m = nfem2.make_field(mwe_M, fun_fill_m)
                ##        print "#######################################"
                ##        print "##       FIRST BATCH  M              ##"
                ##        print "#######################################"
                ##        nfem2.field_print_contents(field_m)

                # update sigma
                for i in range(1, 3):
                    update_sigma(field_sigma, i)
                    print "Forcing ocaml GC!"
                    sys.stdout.flush()
                    ##        nfem2.field_print_contents(field_sigma)
                    ocaml.sys_check_heap()

                total_current, field_phi, field_sigma, field_J = compute_total_current(
                    field_sigma)

                nfem2_visual.fields2vtkfile(field_sigma,
                                            "sigma" + str(fi) + ".vtk")
                nfem2_visual.fields2vtkfile(field_phi,
                                            "phi" + str(fi) + ".vtk")
                nfem2_visual.fields2vtkfile(
                    field_J, "current-density" + str(fi) + ".vtk")

                voltage_contact7 = nfem2.probe_field(
                    field_phi, [-20.0, 630.0, 40.0])[0][1]
                voltage_contact8 = nfem2.probe_field(
                    field_phi, [-20.0, 385.0, 40.0])[0][1]

                print total_current
                resistance = voltage / total_current[
                    1]  # resistance: potential / (downward current)
                print "Current: ", total_current
                print "Resistance: ", resistance

                # ideal voltage is 150 in our units (to respect 150 microA in the experiment)
                string2file = "voltage-contacts_11-9: %f\t total current: %f\t contact7: %f\t contact8: %f\n" % (
                    voltage, total_current[1], voltage_contact7,
                    voltage_contact8)
                amrDataFile.write(
                    str(fi) + "  " + str(resistance) + "  " +
                    str(total_current) + "\n")
                amrDataFile.write(string2file)
                amrDataFile.flush()
                return total_current[1] - 150.
Exemple #4
0
            def constant_current( voltage ):




                # Dirichlet Boundary Conditions on our sample:

                def laplace_dbc(coords):

                    #                 top contact                     bottom contact
                    if (coords[1] > 990.0 and coords[0] > 420.0) or (coords[1] < -40.0) : 
                        return 1
                    else:
                        return 0

                def laplace_dbc_values(dof_name_indices,coords):
                    if(coords[1] > 500.0): # greater or smaller than 1/2height of the sample
                        return voltage
                    else:
                        return 0.0    


                prematrix_laplace=nfem2.prematrix(diffop_laplace,
                                                  mwe_drho_by_dt,mwe_phi,
                                                  mwe_mid=mwe_sigma)

                prematrix_J=nfem2.prematrix(diffop_J,
                                            mwe_J,mwe_phi,
                                            mwe_mid=mwe_sigma)


                code_recompute_conductivity="""
                if(have_sigma_Py)
                {
                 double len2_J, sprod_MJ, cos2;
                 double len2_M=M(0)*M(0)+M(1)*M(1)+M(2)*M(2);

                 len2_J=J(0)*J(0)+J(1)*J(1)+J(2)*J(2);
                 sprod_MJ=M(0)*J(0)+M(1)*J(1)+M(2)*J(2);

                 cos2=(fabs(len2_J)<1e-8)?0.0:(sprod_MJ*sprod_MJ/(len2_M*len2_J));
                 sigma_Py = sigma0_Py /( 1. + alpha * cos2);
                }
                /* printf(\"cos2=%f sigma = %8.6f\\n \",cos2, sigma); */
                """

                recompute_conductivity=nfem2.site_wise_applicator(parameter_names=["sigma0_Py","sigma0_Au","alpha"],
                                                                  # all the names of extra parameters
                                                                  code=code_recompute_conductivity,
                                                                  field_mwes=[mwe_sigma,mwe_J,mwe_M]
                                                                  )

                # computing the total current through the sample:

                code_integrate_div_J="""
                if(coords(1)>990.0 && coords(0)>420.0)
                {
                total_current_up+=drho_by_dt;
                }
                else if(coords(1)<-40.0)
                {
                total_current_down+=drho_by_dt;
                }
                else
                {
                double j=drho_by_dt;

                if(j>0)total_bad_current_plus+=j;
                else   total_bad_current_minus+=j;
                }
                """

                accumulate_J_total=nfem2.site_wise_applicator(parameter_names=["total_current_up",
                                                                               "total_current_down",
                                                                               "total_bad_current_plus",
                                                                               "total_bad_current_minus"
                                                                               ],
                                                              code=code_integrate_div_J,
                                                              position_name="coords",
                                                              cofield_mwes=[mwe_drho_by_dt])


                def update_sigma(the_field_sigma,i):
                    compute_J=nfem2.prematrix_applicator(prematrix_J,
                                                         field_mid=the_field_sigma)
                    laplace_solver=nfem2.laplace_solver(prematrix_laplace,
                                                        dirichlet_bcs=[(-1,4,laplace_dbc),(-1,6,laplace_dbc)],
                                                        mwe_mid=the_field_sigma)
                    cofield_drho_by_dt=nfem2.make_cofield(mwe_drho_by_dt)
                    #
                    field_phi = laplace_solver(cofield_drho_by_dt,
                                               dbc_values=laplace_dbc_values)

                    field_J = nfem2.cofield_to_field(compute_J(field_phi))

                    # Next, let us compute the new condictivity by site-wise operation on
                    # field_J. We just overwrite field_sigma:
                    recompute_conductivity([sigma0_Py,sigma0_Au,alpha],fields=[the_field_sigma,field_J,field_m])

                    return the_field_sigma

                def compute_total_current(the_field_sigma):

                    laplace_solver=nfem2.laplace_solver(prematrix_laplace,
                                                        # boundary conditions are defined on objects 4 and 6
                                                        dirichlet_bcs=[(-1,4,laplace_dbc),(-1,6,laplace_dbc)],
                                                        mwe_mid=the_field_sigma)
                    compute_div_J=nfem2.prematrix_applicator(prematrix_laplace,
                                                             field_mid=the_field_sigma)

                    cofield_drho_by_dt=nfem2.make_cofield(mwe_drho_by_dt)

                    field_phi=laplace_solver(cofield_drho_by_dt,
                                             dbc_values=laplace_dbc_values)

                    compute_J=nfem2.prematrix_applicator(prematrix_J,
                                                         field_mid=the_field_sigma)

                    field_J = nfem2.cofield_to_field(compute_J(field_phi))

                    cofield_div_J=compute_div_J(field_phi)

                    field_div_J = nfem2.cofield_to_field(cofield_div_J)
                    current = accumulate_J_total([0.0,0.0,0.0,0.0],cofields=[cofield_div_J])

                    return current, field_phi, the_field_sigma, field_J


                global field_m
                global field_sigma
                # Later on, we will modify this fields:
                field_sigma = None
                field_m = None

                ocaml.sys_check_heap()

                field_sigma=nfem2.make_field(mwe_sigma,fun_sigma0)
        ##        print "#######################################"
        ##        print "##          FIRST BATCH  SIGMA       ##"
        ##        print "#######################################"
        ##        nfem2.field_print_contents(field_sigma)

                field_m=nfem2.make_field(mwe_M, fun_fill_m)
        ##        print "#######################################"
        ##        print "##       FIRST BATCH  M              ##"
        ##        print "#######################################"
        ##        nfem2.field_print_contents(field_m)


                # update sigma
                for i in range(1,3): 
                    update_sigma(field_sigma,i)
                    print "Forcing ocaml GC!"
                    sys.stdout.flush()
            ##        nfem2.field_print_contents(field_sigma)
                    ocaml.sys_check_heap()


                total_current, field_phi, field_sigma, field_J = compute_total_current(field_sigma)

                nfem2_visual.fields2vtkfile( field_sigma, "sigma"+str(fi)+".vtk")
                nfem2_visual.fields2vtkfile( field_phi, "phi"+str(fi)+".vtk")
                nfem2_visual.fields2vtkfile( field_J, "current-density"+str(fi)+".vtk")

                voltage_contact7 = nfem2.probe_field(field_phi,[-20.0,630.0, 40.0])[0][1]
                voltage_contact8 = nfem2.probe_field(field_phi,[-20.0,385.0, 40.0])[0][1]

                print total_current
                resistance = voltage/total_current[1] # resistance: potential / (downward current)
                print "Current: ",total_current
                print "Resistance: ",resistance

                # ideal voltage is 150 in our units (to respect 150 microA in the experiment)
                string2file = "voltage-contacts_11-9: %f\t total current: %f\t contact7: %f\t contact8: %f\n" % (voltage, total_current[1], voltage_contact7, voltage_contact8)
                amrDataFile.write(str(fi)+"  "+str(resistance)+"  "+str(total_current)+"\n")
                amrDataFile.write(string2file)
                amrDataFile.flush()
                return total_current[1]-150.