diff --git a/src/module.c b/src/module.c index 17852dacb..8e8fc740c 100644 --- a/src/module.c +++ b/src/module.c @@ -73,6 +73,7 @@ void InitializeModule(MODULE *module,int iNumBodies) { module->iaFlare = malloc(iNumBodies*sizeof(int)); module->iaGalHabit = malloc(iNumBodies*sizeof(int)); module->iaSpiNBody = malloc(iNumBodies*sizeof(int)); + module->iaMagmOc = malloc(iNumBodies*sizeof(int)); module->iaEqtideStellar = malloc(iNumBodies*sizeof(int)); // Initialize some of the recently malloc'd values in module @@ -93,6 +94,7 @@ void InitializeModule(MODULE *module,int iNumBodies) { module->iaFlare[iBody] = -1; module->iaGalHabit[iBody] = -1; module->iaSpiNBody[iBody] = -1; + module->iaMagmOc[iBody] = -1; module->iaEqtideStellar[iBody] = -1; } @@ -165,6 +167,12 @@ void InitializeModule(MODULE *module,int iNumBodies) { module->fnFinalizeUpdateVelY = malloc(iNumBodies*sizeof(fnFinalizeUpdateVelYModule)); module->fnFinalizeUpdateVelZ = malloc(iNumBodies*sizeof(fnFinalizeUpdateVelZModule)); + module->fnFinalizeUpdateWaterMassMOAtm = malloc(iNumBodies*sizeof(fnFinalizeUpdateWaterMassMOAtmModule)); + module->fnFinalizeUpdateWaterMassSol = malloc(iNumBodies*sizeof(fnFinalizeUpdateWaterMassSolModule)); + module->fnFinalizeUpdateSurfTemp = malloc(iNumBodies*sizeof(fnFinalizeUpdateSurfTempModule)); + module->fnFinalizeUpdatePotTemp = malloc(iNumBodies*sizeof(fnFinalizeUpdatePotTempModule)); + module->fnFinalizeUpdateSolidRadius = malloc(iNumBodies*sizeof(fnFinalizeUpdateSolidRadiusModule)); + // Function Pointer Matrices module->fnLogBody = malloc(iNumBodies*sizeof(fnLogBodyModule*)); module->fnInitializeBody = malloc(iNumBodies*sizeof(fnInitializeBodyModule*)); @@ -215,6 +223,8 @@ void FinalizeModule(BODY *body,MODULE *module,int iBody) { iNumModules++; if (body[iBody].bSpiNBody) iNumModules++; + if (body[iBody].bMagmOc) + iNumModules++; if (body[iBody].bEqtide && body[iBody].bStellar) { iNumModuleMulti++; } @@ -301,6 +311,12 @@ void FinalizeModule(BODY *body,MODULE *module,int iBody) { module->fnFinalizeUpdateVelY[iBody] = malloc(iNumModules*sizeof(fnFinalizeUpdateVelYModule)); module->fnFinalizeUpdateVelZ[iBody] = malloc(iNumModules*sizeof(fnFinalizeUpdateVelZModule)); + module->fnFinalizeUpdateWaterMassMOAtm[iBody] = malloc(iNumModules*sizeof(fnFinalizeUpdateWaterMassMOAtmModule)); + module->fnFinalizeUpdateWaterMassSol[iBody] = malloc(iNumModules*sizeof(fnFinalizeUpdateWaterMassSolModule)); + module->fnFinalizeUpdateSurfTemp[iBody] = malloc(iNumModules*sizeof(fnFinalizeUpdateSurfTempModule)); + module->fnFinalizeUpdatePotTemp[iBody] = malloc(iNumModules*sizeof(fnFinalizeUpdatePotTempModule)); + module->fnFinalizeUpdateSolidRadius[iBody] = malloc(iNumModules*sizeof(fnFinalizeUpdateSolidRadiusModule)); + for (iModule = 0; iModule < (iNumModules); iModule++) { /* Initialize all module functions pointers to point to their respective NULL function. The modules that need actual function will replace them @@ -371,6 +387,12 @@ void FinalizeModule(BODY *body,MODULE *module,int iBody) { module->fnFinalizeUpdateVelX[iBody][iModule] = &FinalizeUpdateNULL; module->fnFinalizeUpdateVelY[iBody][iModule] = &FinalizeUpdateNULL; module->fnFinalizeUpdateVelZ[iBody][iModule] = &FinalizeUpdateNULL; + + module->fnFinalizeUpdateWaterMassMOAtm[iBody][iModule] = &FinalizeUpdateNULL; + module->fnFinalizeUpdateWaterMassSol[iBody][iModule] = &FinalizeUpdateNULL; + module->fnFinalizeUpdateSurfTemp[iBody][iModule] = &FinalizeUpdateNULL; + module->fnFinalizeUpdatePotTemp[iBody][iModule] = &FinalizeUpdateNULL; + module->fnFinalizeUpdateSolidRadius[iBody][iModule] = &FinalizeUpdateNULL; } /************************ @@ -511,8 +533,11 @@ void ReadModules(BODY *body,CONTROL *control,FILES *files,MODULE *module,OPTIONS body[iFile-1].bGalHabit = 1; module->iBitSum[iFile-1] += GALHABIT; } else if (memcmp(sLower(saTmp[iModule]),"spinbody",8) == 0) { - body[iFile-1].bSpiNBody = 1; - module->iBitSum[iFile-1] += SPINBODY; + body[iFile-1].bSpiNBody = 1; + module->iBitSum[iFile-1] += SPINBODY; + } else if (memcmp(sLower(saTmp[iModule]),"magmoc",6) == 0) { + body[iFile-1].bMagmOc = 1; + module->iBitSum[iFile-1] += MAGMOC; } else { if (control->Io.iVerbose >= VERBERR) fprintf(stderr,"ERROR: Unknown Module %s provided to %s.\n",saTmp[iModule],options->cName); @@ -565,6 +590,11 @@ void PrintModuleList(FILE *file,int iBitSum) { space = 1; fprintf(file,"GALHABIT"); } + if (iBitSum & MAGMOC) { + if (space) fprintf(file," "); + space = 1; + fprintf(file,"MAGMOC"); + } if (iBitSum & POISE) { if (space) fprintf(file," "); space = 1; @@ -608,6 +638,7 @@ void InitializeBodyModules(BODY **body,int iNumBodies) { (*body)[iBody].bStellar = 0; (*body)[iBody].bThermint = 0; (*body)[iBody].bSpiNBody = 0; + (*body)[iBody].bMagmOc = 0; } } diff --git a/src/options.c b/src/options.c index e33891e9b..2652bea83 100644 --- a/src/options.c +++ b/src/options.c @@ -986,6 +986,11 @@ void ReadBodyFileNames(CONTROL *control,FILES *files,OPTIONS *options,INFILE *in LineExit(infile->cIn,lTmp[0]); } files->iNumInputs=iNumIndices+1; + if (files->iNumInputs >= MAXFILES) { + fprintf(stderr,"ERROR: Number of input files (%d) exceeds MAXFILES (%d).\n",files->iNumInputs,MAXFILES); + fprintf(stderr,"Either use less body files, or increase MAXFILES in vplanet.h.\n"); + LineExit(infile->cIn,lTmp[0]); + } } else { if (control->Io.iVerbose >= VERBERR) fprintf(stderr,"ERROR: Option %s is required in file %s.\n",options->cName,infile->cIn); diff --git a/src/output.c b/src/output.c index 47b05f872..7ce646b89 100644 --- a/src/output.c +++ b/src/output.c @@ -1877,5 +1877,4 @@ void InitializeOutput(OUTPUT *output,fnWriteOutput fnWrite[]) { InitializeOutputFlare(output,fnWrite); InitializeOutputGalHabit(output,fnWrite); InitializeOutputSpiNBody(output, fnWrite); - } diff --git a/src/update.c b/src/update.c index 2c1e60d8a..f0c2e8441 100644 --- a/src/update.c +++ b/src/update.c @@ -131,6 +131,11 @@ void InitializeUpdate(BODY*body,CONTROL *control,MODULE *module,UPDATE *update,f update[iBody].iNumVelX = 0; update[iBody].iNumVelY = 0; update[iBody].iNumVelZ = 0; + update[iBody].iNumWaterMassMOAtm = 0; + update[iBody].iNumWaterMassSol = 0; + update[iBody].iNumSurfTemp = 0; + update[iBody].iNumPotTemp = 0; + update[iBody].iNumSolidRadius = 0; update[iBody].iNumLostAngMom=0; update[iBody].iNumLostEng=0; update[iBody].iNumVars=0; @@ -350,6 +355,151 @@ void InitializeUpdate(BODY*body,CONTROL *control,MODULE *module,UPDATE *update,f iVar++; } + update[iBody].iWaterMassMOAtm = -1; + if (update[iBody].iNumWaterMassMOAtm) { + update[iBody].iWaterMassMOAtm = iVar; + update[iBody].iaVar[iVar] = VWATERMASSMOATM; + update[iBody].iNumEqns[iVar] = update[iBody].iNumWaterMassMOAtm; + update[iBody].pdVar[iVar] = &body[iBody].dWaterMassMOAtm; + update[iBody].iNumBodies[iVar] = malloc(update[iBody].iNumWaterMassMOAtm*sizeof(int)); + update[iBody].iaBody[iVar] = malloc(update[iBody].iNumWaterMassMOAtm*sizeof(int*)); + update[iBody].iaType[iVar] = malloc(update[iBody].iNumWaterMassMOAtm*sizeof(int)); + update[iBody].iaModule[iVar] = malloc(update[iBody].iNumWaterMassMOAtm*sizeof(int)); + + if (control->Evolve.iOneStep == RUNGEKUTTA) { + control->Evolve.tmpUpdate[iBody].pdVar[iVar] = &control->Evolve.tmpBody[iBody].dWaterMassMOAtm; + control->Evolve.tmpUpdate[iBody].iNumBodies[iVar] = malloc(update[iBody].iNumWaterMassMOAtm*sizeof(int)); + control->Evolve.tmpUpdate[iBody].daDerivProc[iVar] = malloc(update[iBody].iNumWaterMassMOAtm*sizeof(double)); + control->Evolve.tmpUpdate[iBody].iaType[iVar] = malloc(update[iBody].iNumWaterMassMOAtm*sizeof(int)); + control->Evolve.tmpUpdate[iBody].iaModule[iVar] = malloc(update[iBody].iNumWaterMassMOAtm*sizeof(int)); + control->Evolve.tmpUpdate[iBody].iaBody[iVar] = malloc(update[iBody].iNumWaterMassMOAtm*sizeof(int*)); + } + + iEqn=0; + for (iModule=0;iModuleiNumModules[iBody];iModule++) + module->fnFinalizeUpdateWaterMassMOAtm[iBody][iModule](body,update,&iEqn,iVar,iBody,iFoo); + + (*fnUpdate)[iBody][iVar]=malloc(iEqn*sizeof(fnUpdateVariable)); + update[iBody].daDerivProc[iVar]=malloc(iEqn*sizeof(double)); + iVar++; + } + + update[iBody].iWaterMassSol = -1; + if (update[iBody].iNumWaterMassSol) { + update[iBody].iWaterMassSol = iVar; + update[iBody].iaVar[iVar] = VWATERMASSSOL; + update[iBody].iNumEqns[iVar] = update[iBody].iNumWaterMassSol; + update[iBody].pdVar[iVar] = &body[iBody].dWaterMassSol; + update[iBody].iNumBodies[iVar] = malloc(update[iBody].iNumWaterMassSol*sizeof(int)); + update[iBody].iaBody[iVar] = malloc(update[iBody].iNumWaterMassSol*sizeof(int*)); + update[iBody].iaType[iVar] = malloc(update[iBody].iNumWaterMassSol*sizeof(int)); + update[iBody].iaModule[iVar] = malloc(update[iBody].iNumWaterMassSol*sizeof(int)); + + if (control->Evolve.iOneStep == RUNGEKUTTA) { + control->Evolve.tmpUpdate[iBody].pdVar[iVar] = &control->Evolve.tmpBody[iBody].dWaterMassSol; + control->Evolve.tmpUpdate[iBody].iNumBodies[iVar] = malloc(update[iBody].iNumWaterMassSol*sizeof(int)); + control->Evolve.tmpUpdate[iBody].daDerivProc[iVar] = malloc(update[iBody].iNumWaterMassSol*sizeof(double)); + control->Evolve.tmpUpdate[iBody].iaType[iVar] = malloc(update[iBody].iNumWaterMassSol*sizeof(int)); + control->Evolve.tmpUpdate[iBody].iaModule[iVar] = malloc(update[iBody].iNumWaterMassSol*sizeof(int)); + control->Evolve.tmpUpdate[iBody].iaBody[iVar] = malloc(update[iBody].iNumWaterMassSol*sizeof(int*)); + } + + iEqn=0; + for (iModule=0;iModuleiNumModules[iBody];iModule++) + module->fnFinalizeUpdateWaterMassSol[iBody][iModule](body,update,&iEqn,iVar,iBody,iFoo); + + (*fnUpdate)[iBody][iVar]=malloc(iEqn*sizeof(fnUpdateVariable)); + update[iBody].daDerivProc[iVar]=malloc(iEqn*sizeof(double)); + iVar++; + } + + update[iBody].iSurfTemp = -1; + if (update[iBody].iNumSurfTemp) { + update[iBody].iSurfTemp = iVar; + update[iBody].iaVar[iVar] = VSURFTEMP; + update[iBody].iNumEqns[iVar] = update[iBody].iNumSurfTemp; + update[iBody].pdVar[iVar] = &body[iBody].dSurfTemp; + update[iBody].iNumBodies[iVar] = malloc(update[iBody].iNumSurfTemp*sizeof(int)); + update[iBody].iaBody[iVar] = malloc(update[iBody].iNumSurfTemp*sizeof(int*)); + update[iBody].iaType[iVar] = malloc(update[iBody].iNumSurfTemp*sizeof(int)); + update[iBody].iaModule[iVar] = malloc(update[iBody].iNumSurfTemp*sizeof(int)); + + if (control->Evolve.iOneStep == RUNGEKUTTA) { + control->Evolve.tmpUpdate[iBody].pdVar[iVar] = &control->Evolve.tmpBody[iBody].dSurfTemp; + control->Evolve.tmpUpdate[iBody].iNumBodies[iVar] = malloc(update[iBody].iNumSurfTemp*sizeof(int)); + control->Evolve.tmpUpdate[iBody].daDerivProc[iVar] = malloc(update[iBody].iNumSurfTemp*sizeof(double)); + control->Evolve.tmpUpdate[iBody].iaType[iVar] = malloc(update[iBody].iNumSurfTemp*sizeof(int)); + control->Evolve.tmpUpdate[iBody].iaModule[iVar] = malloc(update[iBody].iNumSurfTemp*sizeof(int)); + control->Evolve.tmpUpdate[iBody].iaBody[iVar] = malloc(update[iBody].iNumSurfTemp*sizeof(int*)); + } + + iEqn=0; + for (iModule=0;iModuleiNumModules[iBody];iModule++) + module->fnFinalizeUpdateSurfTemp[iBody][iModule](body,update,&iEqn,iVar,iBody,iFoo); + + (*fnUpdate)[iBody][iVar]=malloc(iEqn*sizeof(fnUpdateVariable)); + update[iBody].daDerivProc[iVar]=malloc(iEqn*sizeof(double)); + iVar++; + } + + update[iBody].iPotTemp = -1; + if (update[iBody].iNumPotTemp) { + update[iBody].iPotTemp = iVar; + update[iBody].iaVar[iVar] = VPOTTEMP; + update[iBody].iNumEqns[iVar] = update[iBody].iNumPotTemp; + update[iBody].pdVar[iVar] = &body[iBody].dPotTemp; + update[iBody].iNumBodies[iVar] = malloc(update[iBody].iNumPotTemp*sizeof(int)); + update[iBody].iaBody[iVar] = malloc(update[iBody].iNumPotTemp*sizeof(int*)); + update[iBody].iaType[iVar] = malloc(update[iBody].iNumPotTemp*sizeof(int)); + update[iBody].iaModule[iVar] = malloc(update[iBody].iNumPotTemp*sizeof(int)); + + if (control->Evolve.iOneStep == RUNGEKUTTA) { + control->Evolve.tmpUpdate[iBody].pdVar[iVar] = &control->Evolve.tmpBody[iBody].dPotTemp; + control->Evolve.tmpUpdate[iBody].iNumBodies[iVar] = malloc(update[iBody].iNumPotTemp*sizeof(int)); + control->Evolve.tmpUpdate[iBody].daDerivProc[iVar] = malloc(update[iBody].iNumPotTemp*sizeof(double)); + control->Evolve.tmpUpdate[iBody].iaType[iVar] = malloc(update[iBody].iNumPotTemp*sizeof(int)); + control->Evolve.tmpUpdate[iBody].iaModule[iVar] = malloc(update[iBody].iNumPotTemp*sizeof(int)); + control->Evolve.tmpUpdate[iBody].iaBody[iVar] = malloc(update[iBody].iNumPotTemp*sizeof(int*)); + } + + iEqn=0; + for (iModule=0;iModuleiNumModules[iBody];iModule++) + module->fnFinalizeUpdatePotTemp[iBody][iModule](body,update,&iEqn,iVar,iBody,iFoo); + + (*fnUpdate)[iBody][iVar]=malloc(iEqn*sizeof(fnUpdateVariable)); + update[iBody].daDerivProc[iVar]=malloc(iEqn*sizeof(double)); + iVar++; + } + + update[iBody].iSolidRadius = -1; + if (update[iBody].iNumSolidRadius) { + update[iBody].iSolidRadius = iVar; + update[iBody].iaVar[iVar] = VSOLIDRADIUS; + update[iBody].iNumEqns[iVar] = update[iBody].iNumSolidRadius; + update[iBody].pdVar[iVar] = &body[iBody].dSolidRadius; + update[iBody].iNumBodies[iVar] = malloc(update[iBody].iNumSolidRadius*sizeof(int)); + update[iBody].iaBody[iVar] = malloc(update[iBody].iNumSolidRadius*sizeof(int*)); + update[iBody].iaType[iVar] = malloc(update[iBody].iNumSolidRadius*sizeof(int)); + update[iBody].iaModule[iVar] = malloc(update[iBody].iNumSolidRadius*sizeof(int)); + + if (control->Evolve.iOneStep == RUNGEKUTTA) { + control->Evolve.tmpUpdate[iBody].pdVar[iVar] = &control->Evolve.tmpBody[iBody].dSolidRadius; + control->Evolve.tmpUpdate[iBody].iNumBodies[iVar] = malloc(update[iBody].iNumSolidRadius*sizeof(int)); + control->Evolve.tmpUpdate[iBody].daDerivProc[iVar] = malloc(update[iBody].iNumSolidRadius*sizeof(double)); + control->Evolve.tmpUpdate[iBody].iaType[iVar] = malloc(update[iBody].iNumSolidRadius*sizeof(int)); + control->Evolve.tmpUpdate[iBody].iaModule[iVar] = malloc(update[iBody].iNumSolidRadius*sizeof(int)); + control->Evolve.tmpUpdate[iBody].iaBody[iVar] = malloc(update[iBody].iNumSolidRadius*sizeof(int*)); + } + + iEqn=0; + for (iModule=0;iModuleiNumModules[iBody];iModule++) + module->fnFinalizeUpdateSolidRadius[iBody][iModule](body,update,&iEqn,iVar,iBody,iFoo); + + (*fnUpdate)[iBody][iVar]=malloc(iEqn*sizeof(fnUpdateVariable)); + update[iBody].daDerivProc[iVar]=malloc(iEqn*sizeof(double)); + iVar++; + } + /* 26Al Core */ update[iBody].i26AlCore = -1; if (update[iBody].iNum26AlCore) { diff --git a/src/vplanet.h b/src/vplanet.h index 5455efb70..51815db31 100644 --- a/src/vplanet.h +++ b/src/vplanet.h @@ -21,6 +21,8 @@ #define BINARY 1024 #define GALHABIT 2048 #define SPINBODY 4096 +#define DISTRES 8192 +#define MAGMOC 16384 /******************** * ADJUST AS NEEDED * XXX And fix sometime! @@ -43,6 +45,7 @@ * FLARE: 2000 - 2100 * BINARY: 2100 - 2200 * GALHABIT: 2200 - 2300 + * MAGMOC: 2300 - 2400 */ #define MODULEOPTEND 2400 #define MODULEOUTEND 2400 @@ -78,6 +81,7 @@ #define YEARDAY 365.25 // Days per year (more precise??) #define MSAT 5.6851e26 // Saturns' Mass (ref?) #define DEGRAD 0.017453292519444445 // Degrees per radian +#define TOMASS 1.39e21 // Mass of one terrestrial ocean in kg (TO) #define ATOMMASS 1.660538921e-27 // Atomic Mass #define SIGMA 5.670367e-8 // Stefan-Boltzmann Constant #define LFICE 3.34e5 // ??? @@ -131,7 +135,7 @@ #define OUTLONDESCR 2048 /* Number of characters in output long description */ #define NAMELEN 100 -#define MAXFILES 24 /* Maximum number of input files */ +#define MAXFILES 128 /* Maximum number of input files */ #define MAXARRAY 128 /* Maximum number of options in * an option array */ #define NUMOPT 1000 /* Number of options that could be @@ -227,6 +231,17 @@ #define VANGMY 2205 #define VANGMZ 2206 +//DISTRES +#define VMEANL 2301 + +//MAGMOC +#define VWATERMASSMOATM 2310 +#define VWATERMASSSOL 2311 +#define VSURFTEMP 2312 +#define VPOTTEMP 2313 +#define VSOLIDRADIUS 2314 + + /* Now define the structs */ #define MAXSPECIES 100 @@ -957,6 +972,20 @@ struct BODY { double dMeanL; /**< Body's mean longitude */ + //MAGMOC + int bMagmOc; /**< Use magmoc model */ + double dFeO; /**< FeO in the magma ocean */ + double dWaterMassAtm; /**< Water mass in the atmosphere */ + double dWaterMassMOAtm; /**< Water mass in magma ocean and atmosphere */ + double dSurfTemp; /**< Surface Temp of the planet */ + double dManMeltDensity; /**< Density of the molten mantle */ + double dPotTemp; /**< Potential Temp of the mantle */ + double dWaterMassSol; /**< Water mass in the solidified mantle */ + double dSolidRadius; /**< Solidification radius of the mantle */ + double dPrefactorA; /**< Prefactor for linear solidus */ + double dPrefactorB; /**< Prefactor for linear solidus */ + double dMeltFraction; /**< Melt fraction of the mantle */ + double dDynamViscos; /**< Dynamic viscosity of the mantle */ }; /* SYSTEM contains properties of the system that pertain to @@ -1123,6 +1152,30 @@ struct UPDATE { /* Next comes the identifiers for the module that modifies a variable */ + /* MAGMOC parameters */ + int iWaterMassMOAtm; + int iNumWaterMassMOAtm; + int iWaterMassSol; + int iNumWaterMassSol; + int iSurfTemp; + int iNumSurfTemp; + int iPotTemp; + int iNumPotTemp; + int iSolidRadius; + int iNumSolidRadius; + + double dWaterMassMOAtm; + double dWaterMassSol; + double dSurfTemp; + double dPotTemp; + double dSolidRadius; + + double *pdDWaterMassMOAtm; + double *pdDWaterMassSol; + double *pdDSurfTemp; + double *pdDPotTemp; + double *pdDSolidRadius; + /* SPINBODY parameters */ int iVelX; int iNumVelX; @@ -1814,6 +1867,11 @@ typedef void (*fnFinalizeUpdateAngMZModule)(BODY*,UPDATE*,int*,int,int,int); typedef void (*fnFinalizeUpdateMeanLModule)(BODY*,UPDATE*,int*,int,int,int); typedef void (*fnFinalizeUpdateLostAngMomModule)(BODY*,UPDATE*,int*,int,int,int); typedef void (*fnFinalizeUpdateLostEngModule)(BODY*,UPDATE*,int*,int,int,int); +typedef void (*fnFinalizeUpdateWaterMassMOAtmModule)(BODY*,UPDATE*,int*,int,int,int); +typedef void (*fnFinalizeUpdateWaterMassSolModule)(BODY*,UPDATE*,int*,int,int,int); +typedef void (*fnFinalizeUpdateSurfTempModule)(BODY*,UPDATE*,int*,int,int,int); +typedef void (*fnFinalizeUpdatePotTempModule)(BODY*,UPDATE*,int*,int,int,int); +typedef void (*fnFinalizeUpdateSolidRadiusModule)(BODY*,UPDATE*,int*,int,int,int); typedef void (*fnReadOptionsModule)(BODY*,CONTROL*,FILES*,OPTIONS*,SYSTEM*,fnReadOption*,int); typedef void (*fnVerifyModule)(BODY*,CONTROL*,FILES*,OPTIONS*,OUTPUT*,SYSTEM*,UPDATE*,int,int); @@ -1842,6 +1900,7 @@ struct MODULE { int *iaFlare; int *iaGalHabit; int *iaSpiNBody; + int *iaMagmOc; int *iaEqtideStellar; /*! These functions count the number of applicable halts for each body. */ @@ -1986,6 +2045,13 @@ struct MODULE { fnFinalizeUpdateLXUVModule **fnFinalizeUpdateLXUV; + /*! Function pointers to finalize magmoc functions */ + fnFinalizeUpdateWaterMassMOAtmModule **fnFinalizeUpdateWaterMassMOAtm; + fnFinalizeUpdateWaterMassSolModule **fnFinalizeUpdateWaterMassSol; + fnFinalizeUpdateSurfTempModule **fnFinalizeUpdateSurfTemp; + fnFinalizeUpdatePotTempModule **fnFinalizeUpdatePotTemp; + fnFinalizeUpdateSolidRadiusModule **fnFinalizeUpdateSolidRadius; + /*! These functions log module-specific data. */ fnLogBodyModule **fnLogBody;