Structure


Sections:


Diagrams

magpar is based on PETSc, which provides the required parallel data structures, linear algebra operations and solvers. PETSc in turn is based on MPI for message passing and the BLAS and LAPACK libraries (non-parallel) for linear algebra.

prgstruct_petsc.eps.gif

PETSc structure

TAO and PVODE are used for energy minimization and dynamic time integration. Mesh partitioning, data compression, and graphics output are done by some more (non-parallel) libraries, Metis, zlib, and libpng, respectively.

prgstruct_rest.eps.gif

Additional libraries

The following figure gives a coarse flow chart of magpar (not quite up to date).

flowall.gif

magpar flow chart

More detailed information about the libraries can be found on the page about Required Software.


Main program

main.c

main.c::main


Initialization

Serial part

serinit.c::SerInit

  ierr = InitInfo();CHKERRQ(ierr);
  ierr = ReadMesh(gdata);CHKERRQ(ierr);
  ierr = ReadKrn(gdata);CHKERRQ(ierr);
  ierr = ModifyPropSer(gdata);CHKERRQ(ierr);
  ierr = ModifyPropSerGrains(gdata);CHKERRQ(ierr);
  ierr = MagInit(gdata);CHKERRQ(ierr);
  ierr = Hext_in1_Init(gdata);CHKERRQ(ierr);
  ierr = Hext_in2_Init(gdata);CHKERRQ(ierr);
  ierr = FilterElements(&gdata->n_ele,&gdata->elevert,&gdata->eleprop,gdata->propdat);CHKERRQ(ierr);
  ierr = MeshMirror(&gdata->n_vert,&gdata->n_ele,&gdata->vertxyz,&gdata->elevert,&gdata->eleprop);CHKERRQ(ierr);
  ierr = FilterNodes(&gdata->n_vert,&gdata->n_ele,&gdata->vertxyz,gdata->elevert,&gdata->M,&gdata->VH1,&gdata->VH2);CHKERRQ(ierr);
  ierr = FilterElements(&gdata->n_ele,&gdata->elevert,&gdata->eleprop,gdata->propdat);CHKERRQ(ierr);
  ierr = RegularRefinement(gdata);CHKERRQ(ierr);
  ierr = DecoupleGrains(gdata);CHKERRQ(ierr);
  ierr = Reorder(gdata);CHKERRQ(ierr);
  ierr = FacNB(gdata);CHKERRQ(ierr);
  ierr = VertProp(gdata);CHKERRQ(ierr);
  ierr = DataPartitionSurfSer(gdata);CHKERRQ(ierr);
  ierr = DistortMesh(gdata);CHKERRQ(ierr);
  ierr = DataMoveData(gdata);CHKERRQ(ierr);

Parallel part

parinit.c::ParInit

  ierr = PetscOptionsGetInt(PETSC_NULL,"-mode",(PetscInt*)&gdata->mode,&flg);CHKERRQ(ierr);
  ierr = ModifyPropPar(gdata);CHKERRQ(ierr);
  ierr = EleVertVol(gdata);CHKERRQ(ierr);
  ierr = PetscOptionsGetReal(PETSC_NULL,"-ts_init_time",&tstart,&flg);CHKERRQ(ierr);
  ierr = Htot(gdata);CHKERRQ(ierr);
  ierr = Htot_Energy(gdata);CHKERRQ(ierr);
      ierr = myTSCreatePVode(gdata);CHKERRQ(ierr);
      ierr = WriteFEMAVS(gdata);CHKERRQ(ierr);
      ierr = CheckIterationLLG(gdata);CHKERRQ(ierr);
      ierr = myTSCreateEmini(gdata);CHKERRQ(ierr);
      ierr = WriteFEMAVS(gdata);CHKERRQ(ierr);
      ierr = CheckIterationEmini(gdata);CHKERRQ(ierr);
  ierr = DataDestroyInit(gdata);CHKERRQ(ierr);

Solution loop

main.c::Solve

# pseudocode
while (keepsolving)
switch: -mode

(see allopt.txt)
main.c::keepsolving: check exit conditions, write project.9999.* (checkpoint) files, check after each iteration

Field and energy calculation

htot.c::Htot

  ierr = Hcubic(gdata,VHtotsum);CHKERRQ(ierr);
  ierr = Hdemag(gdata,VHtotsum);CHKERRQ(ierr);
  ierr = Helastic(gdata,VHtotsum);CHKERRQ(ierr);
  ierr = Hexchani(gdata,VHtotsum);CHKERRQ(ierr);
  ierr = Hexternal(gdata,VHtotsum);CHKERRQ(ierr);
  [...]

accordingly for energy (note that in general E!=M.H !)

Energy minimization

Initialization: eminisolve.c::myTSCreateEmini
Solution: eminisolve.c::EminiSolve : call TaoSolve to find energ minimum

LLG time integration

Initialization: mytscreatepvode.c::myTSCreatePVode
Solution: mytssteppvode.c::myTSStepPVode : call CVode to take on time step
LLG right hand side: rhsfunction.c::RHSfunction calls calc_dMdt::calc_dMdt.c
Preconditioning: precond.c::Precond, Jacobian: myllgjacobian.c::myLLGJacobian


Finalizing

Write final entry in log files and final set of output files

  ierr = WriteLog(gdata);CHKERRQ(ierr);
  ierr = WriteSet(gdata);CHKERRQ(ierr);
  PetscFinalize();

At the end of the program we do not clean up carefully (i.e. we do not destroy all data structures or free dynamically allocated memory) because the OS will do it for us anyway.


GridData: Global data structure

GridData

(see HTML documentation)


magpar - Parallel Finite Element Micromagnetics Package
Copyright (C) 2002-2010 Werner Scholz