00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 static char const Id[] = "$Id: maginit.c 2962 2010-02-04 19:50:44Z scholz $\n\n";
00025 static char const Td[] = "$Today: " __FILE__ " " __DATE__ " " __TIME__ " $\n\n";
00026
00027 #include "init.h"
00028
00029 int MagInit(GridData *gdata)
00030 {
00031 MagparFunctionLogBegin;
00032
00033 int rank,size;
00034 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
00035 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
00036
00037
00038
00039
00040
00041 PetscPrintf(PETSC_COMM_WORLD,"Creating Vec M for %i nodes\n",gdata->n_vert);
00042 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
00043 "<%i>local nodes: %i n_prop: %i\n",
00044 rank,gdata->ln_vert,gdata->n_prop
00045 );
00046 PetscSynchronizedFlush(PETSC_COMM_WORLD);
00047
00048 ierr = VecCreate(PETSC_COMM_WORLD,&gdata->M);CHKERRQ(ierr);
00049 ierr = VecSetSizes(gdata->M,ND*gdata->ln_vert,PETSC_DECIDE);CHKERRQ(ierr);
00050 ierr = VecSetFromOptions(gdata->M);CHKERRQ(ierr);
00051 ierr = VecSetBlockSize(gdata->M,ND);CHKERRQ(ierr);
00052
00053 int *init_mag;
00054 PetscReal *init_magparm;
00055 ierr = PetscMalloc(gdata->n_prop*sizeof(int),&init_mag);CHKERRQ(ierr);
00056 ierr = PetscMalloc(gdata->n_prop*sizeof(PetscReal),&init_magparm);CHKERRQ(ierr);
00057
00058 for (int i=0;i<gdata->n_prop;i++){
00059 init_mag[i]=3;
00060 init_magparm[i]=0.0;
00061 }
00062
00063 int nmax = gdata->n_prop;
00064
00065 PetscTruth flg;
00066 ierr = PetscOptionsGetIntArray(PETSC_NULL,"-init_mag",(PetscInt*)init_mag,(PetscInt*)&nmax,&flg);CHKERRQ(ierr);
00067 if (flg!=PETSC_TRUE) {
00068 init_mag[0]=3;
00069 PetscPrintf(PETSC_COMM_WORLD,
00070 "Option -init_mag not found, using default value: %i\n",
00071 init_mag[0]
00072 );
00073 }
00074 if (nmax<=1) {
00075 ierr = PetscOptionsGetReal(PETSC_NULL,"-init_magparm",init_magparm,&flg);CHKERRQ(ierr);
00076 if (flg!=PETSC_TRUE) {
00077 init_magparm[0]=0;
00078 PetscPrintf(PETSC_COMM_WORLD,
00079 "Option -init_magparm not found, using default value: %g\n",
00080 init_magparm[0]
00081 );
00082 }
00083
00084 ierr = MagSet(-1,init_mag[0],init_magparm[0],gdata);CHKERRQ(ierr);
00085 }
00086 else if (nmax==gdata->n_prop) {
00087 nmax = gdata->n_prop;
00088 ierr = PetscOptionsGetRealArray(PETSC_NULL,"-init_magparm",init_magparm,(PetscInt*)&nmax,&flg);CHKERRQ(ierr);
00089 if (flg!=PETSC_TRUE) {
00090 PetscPrintf(PETSC_COMM_WORLD,
00091 "Option -init_magparm not found, using default value %g for all volumes\n",
00092 init_magparm[0]
00093 );
00094 }
00095 else if (nmax!=gdata->n_prop) {
00096 SETERRQ2(PETSC_ERR_ARG_INCOMP,
00097 "Wrong number of values for option -init_magparm! %i != %i\n",
00098 nmax,gdata->n_prop
00099 );
00100 }
00101 for (int i=0;i<gdata->n_prop;i++){
00102 ierr = MagSet(i,init_mag[i],init_magparm[i],gdata);CHKERRQ(ierr);
00103 }
00104 }
00105 else {
00106 SETERRQ2(PETSC_ERR_ARG_INCOMP,
00107 "Wrong number of values for option -init_mag! %i != %i\n",
00108 nmax,gdata->n_prop
00109 );
00110 }
00111
00112 ierr = PetscFree(init_mag);CHKERRQ(ierr);
00113 ierr = PetscFree(init_magparm);CHKERRQ(ierr);
00114
00115 MagparFunctionLogReturn(0);
00116 }