|
Code /
CardioWave.h/* CardioWave - main include file */ /* Copyright John B. Pormann, 21 July 2000, all rights reserved */ /* RCSID: $Id: CardioWave.h,v 1.10 2005/02/17 18:38:25 john Exp $ */ #ifndef _SIMSYSTEM_H #define _SIMSYSTEM_H #include <stdlib.h> #include <stdio.h> #include <stddef.h> #include <string.h> #include <math.h> #include <malloc.h> #include <memory.h> #include <time.h> #include "mpi.h?" #if defined(_SGL) typedef float real; #define MPI_SSREAL MPI_FLOAT #else typedef double real; #define MPI_SSREAL MPI_DOUBLE #endif /* compute offset of a member in a structure */ #define OffsetOf?(type,member) (offsetof(type,member)/sizeof(real)) /* some other handy data types */ typedef enum { false = 0, true = -1, no = 0, yes = -1 } logical; typedef unsigned char byte; #define and && #define or || #define not ! #define mod % /* simulation type */ typedef enum { Error = -1, Monodomain = 1, ReducedBidomain? = 2, FullBidomain? = 3, ReducedBidomainBath? = 4, FullBidomainBath? = 5 } sim_t; /* domain type */ typedef enum { Undefd = -1, Tissue = 0, Intracellular = 1, Intra = 1, Extracellular = 2, Extra = 2, Bath = 3, Solver = 4, State = 5, StateVar? = 5, Aux = 6, AuxVar? = 6, Memparam = 7, Param = 7 } domain_t; typedef enum { TYPE_BYTE = 1, TYPE_CHAR = 1, TYPE_INT = 2, TYPE_REAL = 3 } datatype_t; /* this header is for the full-matrix, vector, and sparse-matrix operations */ #include "VectorOps.h" /* the big matrix structure - for the solver */ /* : other arrays are size NumComm? */ typedef struct { int Rows,Cols; int NumBlocks?; int* BlockSplit?; sparse* MatrixInfo?; } bigmatrix; #define _INIT_BIGMATRIX {0,0,0,NULL,NULL} /* some defined constants */ #define MAX_PROCS 256 #define MAX_RESOURCES 256 #define MAX_FILENAME 128 #define MAX_PATCHSIZE 64 #define MAX_STIM 32 #define MAX_MEMBRANE 8 #define G2L?_REMOTE -1 #define GETJ_ALL 0 #define GETJ_DIDV 1 /* for the byte type, -1 won't work */ #define ByteError? 255 /* for parsing the resource strings */ typedef struct { char* txt; int cmd; } rword; /* function prototypes */ int InitSimulation( char** resources ); void ExitSimulation( vector Vm, vector Vx, vector Q, vector Av ); int GetNodeInfo?( void ); int ComputeSizes( char** resources ); int DomainLocalSize( domain_t dt ); int DomainGlobalSize( domain_t dt ); int GetInitialValues( vector* Vm, vector* Vx, vector* Q, vector* Av ); int Checkpoint( real t, vector Vm, vector Vx, vector Q, vector Av ); int NextMsgTag( void ); real GetMemUsed( void ); /* : defined in SimSystem?.c - calls ??_GetF in Membrane models */ int GetF( vector Vm, vector Q, vector Fv, vector Fq, vector Av ); /* : for the membrane patches */ int InitMembrane?( char** resources ); void SetPatches?( vector Vm, vector Q ); void GetJ?( int flag, real dt, real theta, vector Vm, vector Q, vector Gv, vector Gq, vector JJ, vector ZZ ); void GetDQ?( real dt, real theta, vector Vm, vector Q, vector Gv, vector Gq, vector Dv, vector Dq ); void ExitMembrane?( void ); /* : for the time-steppers */ int InitTimeStepper( char** res, real* t ); int Update( real* t, vector Vm, vector Vx, vector Q, vector Av ); void ExitTimeStepper( void ); /* :: defined in time-stepper but called as an interrupt handler */ void CatchSignal( int i ); /* : for the domain model */ int InitDomain( char** resources ); void ExitDomain( void ); /* : for the stimulus model */ int InitStimulus( char** resources ); void ApplyStimulus( int IntraOrExtra?, real t, real alpha,vector Fv,vector Fq ); void ExitStimulus( void ); /* : for the linear solvers */ int InitLinearSolver( char** resources ); int Solve( bigmatrix A, vector x, vector b ); void ExitLinearSolver( void ); /* : for the preconditioners */ int InitPreconditioner( char** resources ); void ComputeFactors( bigmatrix A ); int PreconditionSystem( bigmatrix A, vector x, vector b ); void ExitPreconditioner( void ); /* : for the boundary conditions */ int InitBCs?( char** resources ); void ApplyBCmatrix?( bigmatrix A ); void ApplyBCvector?( real t, bigmatrix A, vector x, vector y ); void ExitBCs?( void ); /* : Parallel kernel */ int InitParallel( char** resources ); int CreateRegularSplitting( domain_t dt, int xd, int yd, int zd ); int CreateIrregularSplitting( domain_t dt, int sz, int bw ); int WriteGlobalData( void* ptr, int num, datatype_t dtp, domain_t d, FILE* fp ); int ReadGlobalData( void* ptr, int num, datatype_t dtp, domain_t d, FILE* fp ); int Global2Local( domain_t dt, int gl ); int Local2Global( domain_t dt, int lc ); int OwnerOfLocal( domain_t dt, int lc ); int OwnerOfGlobal( domain_t dt, int gl ); /* defined in Parallel kernels */ int MatAlloc( bigmatrix* M, int nblks, int* blksz, domain_t* dtps, int type, int mnz, int mnz2 ); int MatCommSetup?( bigmatrix M ); int MatVec( real alpha, bigmatrix A, vector x, real beta, vector y ); int MatAdd( real alpha, bigmatrix A, bigmatrix B ); int MatScale( real alpha, bigmatrix A ); int MatCopy( bigmatrix A, bigmatrix B ); real MatGet( bigmatrix A, int i, int j ); int MatPut( bigmatrix A, int i, int j, real v ); void MatGetNonzeros( bigmatrix A, int i, int* n, int* lst ); /* :: used in catching signals */ real ProcessSignal?( real x ); /* : alias into the Vx vector */ int AliasVxVi( vector Vx, vector* Vi ); int AliasVxVe( vector Vx, vector* Ve ); int AliasVxVb( vector Vx, vector* Vb ); /* helper functions */ int AppendResources( char** res, int ac, char** av ); int NumResources( char** res ); int NumWords( rword* list ); real GetRealValue( char* txt ); int GetIntValue( char* txt ); logical GetTFValue( char* txt ); byte GetByteValue( char* txt ); int GetNumValues( char* txt ); int* GetIntArray( char* txt ); real* GetRealArray( char* txt ); char* GetStringValue( char* txt ); int FindCommand( rword* list, char* res ); int FindNum( char* txt ); /* global variables */ /* : defined in SimSystem?.c */ extern int NumPEs,SelfPE,NextPE?,PrevPE?; extern int NumMem; /* : MaxComm? is defined in Parallel module */ extern int MaxComm?; /* : filled in by Mem modules */ extern int PatchSize[MAX_MEMBRANE]; extern logical UseAuxvars; extern int AuxiliarySize[MAX_MEMBRANE]; extern int MemParamSize[MAX_MEMBRANE]; extern int (*FunctionTable[MAX_MEMBRANE])(); extern void (*SetpatchTable[MAX_MEMBRANE])(); /* : in SimSystem? kernel */ extern int DebugLevel; extern logical LoadState,SaveState; extern FILE* FpResources; extern char* LoadStateFilename; extern char* SaveStateFilename; extern real Beta,Cm; extern vector Workspace; /* : defined in the Time-stepper */ extern sim_t SimType; extern logical NeedVolume, NeedInvVolume; /* : defined in the kernel, but initialized by Grid routines */ extern vector Volume; extern vector InvVolume; extern vector MemParams; extern bvector NodeType; extern int TissueGlobalSize,TissueLocalSize; extern int BathGlobalSize,BathLocalSize; extern int StateGlobalSize,StateLocalSize; extern int AuxiliaryGlobalSize,AuxiliaryLocalSize; extern int SolverGlobalSize,SolverLocalSize; extern int MemparamGlobalSize,MemparamLocalSize; extern int* TissueSplit; extern int* BathSplit; extern int* SolverSplit; extern int* StateSplit; extern int* AuxiliarySplit; extern int* MemparamSplit; extern sparse MatrixINT,MatrixEXT,MatrixBATH; extern sparse MatrixE2B,MatrixB2E; #endif |