/******************************************************************************/ /* */ /* CONV (converter) for Agrif (Adaptive Grid Refinement In Fortran) */ /* */ /* Copyright or or Copr. Laurent Debreu (Laurent.Debreu@imag.fr) */ /* Cyril Mazauric (Cyril_Mazauric@yahoo.fr) */ /* This software is governed by the CeCILL-C license under French law and */ /* abiding by the rules of distribution of free software. You can use, */ /* modify and/ or redistribute the software under the terms of the CeCILL-C */ /* license as circulated by CEA, CNRS and INRIA at the following URL */ /* "http://www.cecill.info". */ /* */ /* As a counterpart to the access to the source code and rights to copy, */ /* modify and redistribute granted by the license, users are provided only */ /* with a limited warranty and the software's author, the holder of the */ /* economic rights, and the successive licensors have only limited */ /* liability. */ /* */ /* In this respect, the user's attention is drawn to the risks associated */ /* with loading, using, modifying and/or developing or reproducing the */ /* software by the user in light of its specific status of free software, */ /* that may mean that it is complicated to manipulate, and that also */ /* therefore means that it is reserved for developers and experienced */ /* professionals having in-depth computer knowledge. Users are therefore */ /* encouraged to load and test the software's suitability as regards their */ /* requirements in conditions enabling the security of their systems and/or */ /* data to be ensured and, more generally, to use and operate it in the */ /* same conditions as regards security. */ /* */ /* The fact that you are presently reading this means that you have had */ /* knowledge of the CeCILL-C license and that you accept its terms. */ /******************************************************************************/ /* version 1.6 */ /******************************************************************************/ #define LONGNOM 800 #define LONGLIGNE 800 /******************************************************************************/ /*********** Declaration of structures used in conv ***************************/ /******************************************************************************/ typedef struct { char first[LONGNOM]; char last[LONGNOM]; } typedim ; /* fortran dimension as 'ndeb:nfin' */ typedef struct listdim { typedim dim; struct listdim *suiv; } listdim; /* list of the dimensions of a variable */ typedef struct variable { char v_typevar[LONGNOM]; char v_nomvar[LONGNOM] ; char v_oldname[LONGNOM] ; char v_dimchar[LONGNOM]; char v_modulename[LONGNOM]; char v_commonname[LONGNOM]; char v_vallengspec[LONGNOM]; char v_nameinttypename[LONGNOM]; char v_commoninfile[LONGNOM]; char v_subroutinename[LONGNOM]; char v_precision[LONGNOM]; char v_initialvalue[LONGNOM]; char v_IntentSpec[LONGNOM]; char v_readedlistdimension[LONGNOM]; int v_nbdim; int v_common; int v_positioninblock; int v_module; int v_save; int v_VariableIsParameter; int v_PublicDeclare; int v_PrivateDeclare; int v_ExternalDeclare; int v_pointedvar; int v_notgrid; int v_dimensiongiven; int v_c_star; int v_indicetabvars; int v_pointerdeclare; int v_optionaldeclare; int v_allocatable; int v_dimsempty; listdim *v_dimension; } variable ; /* type of a variable */ /* v_typevar : type (integer, real, ...) */ /* v_nomvar : name of the variable */ /* v_dimension : list of dimensions of the variable*/ /* v_nbdim: 1 if the variable is 1d, etc ... */ /* precision : Name of the variable which */ /* determine the precision. example : wp in the */ /* case where REAL(wp) */ typedef struct listvar { variable *var ; struct listvar * suiv; } listvar ; /* list of variables */ typedef struct listusemodule { char u_usemodule[LONGNOM]; char u_charusemodule[LONGNOM]; char u_cursubroutine[LONGNOM]; char u_modulename[LONGNOM]; int u_firstuse; struct listusemodule * suiv; } listusemodule; /* list of names */ typedef struct listparameter { char p_name[LONGNOM]; char p_modulename[LONGNOM]; struct listparameter * suiv; } listparameter ; /* list of names */ typedef struct listname { char n_name[LONGNOM]; struct listname* suiv; } listname ; /* list of names */ typedef struct listcouple { char c_namevar[LONGNOM]; char c_namepointedvar[LONGNOM]; struct listcouple * suiv; } listcouple; /* list of names */ typedef struct listnom { char o_nom[LONGNOM]; char o_module[LONGNOM]; int o_val; listcouple *couple; struct listnom * suiv; } listnom; /* list of names */ typedef struct listallocate { char a_nomvar[LONGNOM]; char a_subroutine[LONGNOM]; char a_module[LONGNOM]; struct listallocate * suiv; } listallocate ; typedef struct listvarpointtovar { char t_usemodule[LONGNOM]; char t_cursubroutine[LONGNOM]; listcouple *t_couple; struct listvarpointtovar* suiv; }listvarpointtovar ; /* list of names */ typedef struct listindice { int i_indice; struct listindice * suiv; } listindice; /* list of indiced */ variable *curvar; listvar *List_ModuleUsedInModuleUsed_Var; listvar *List_ModuleUsed_Var; listvar *listduplicated; listvar *List_GlobalParameter_Var; listvar *List_Global_Var; listvar *List_Data_Var; listvar *List_Save_Var; listvar *List_SubroutineArgument_Var; listvar *List_SubroutineDeclaration_Var; listvar *List_UsedInSubroutine_Var; listvar *List_Parameter_Var; listvar *List_Dimension_Var; listvar *List_FunctionType_Var; listvar *List_NotGridDepend_Var; listvar *List_Common_Var; listname *List_Pointer_Var; listname *List_ImplicitNoneSubroutine; listusemodule *List_NameOfModuleUsed; listusemodule *List_Include; listusemodule *listofmoduletmp; listusemodule *tmpuselocallist; listparameter *List_GlobParamModuleUsedInModuleUsed_Var; listparameter *List_GlobParamModuleUsed_Var; listnom *List_ContainsSubroutine; listnom *List_Subroutine_For_Alloc; listnom *listofmodules; listnom *List_NameOfModule; listnom *List_NameOfCommon; listnom *List_SubroutineWhereAgrifUsed; listallocate *List_Allocate_Var; listvarpointtovar *List_CouplePointed_Var; /* variables which are pointed to an other one */ listindice *Listofavailableindices; /* List of available indices in the tabvars table */ listdim *curdim; listdim *commondim; /******************************************************************************/ /**************** *** COMMON Variables *** *********************************/ /******************************************************************************/ int positioninblock; char commonvar[LONGNOM]; char commonblockname[LONGNOM]; /******************************************************************************/ /**************** *** AGRIF Variables *** *********************************/ /******************************************************************************/ int inagrifcallargument; int sameagrifargument; int InAgrifParentDef; char sameagrifname[LONGNOM]; /******************************************************************************/ /**************** *** VAR DEF Variables *** *******************************/ /******************************************************************************/ int indicemaxtabvars; /* Number of variables in the model i.e. last */ /* indice used in the tabvars table */ int PublicDeclare; /* Variable has been declared as PUBLIC */ int PrivateDeclare; /* Variable has been declared as PRIVATE */ int ExternalDeclare; /* Variable has been declared as EXTERNAL */ int InitialValueGiven; /* An initial value has been given */ int Allocatabledeclare; int SaveDeclare; int functiondeclarationisdone; int pointerdeclare; int optionaldeclare; int VarType; int VarTypepar; int VariableIsParameter; int dimsgiven; int shouldincludempif; int c_star; char DeclType[LONGNOM]; char nameinttypename[LONGNOM]; int GlobalDeclaration; char InitValue[LONGNOM*2]; char IntentSpec[LONGNOM]; char NamePrecision[LONGNOM]; char CharacterSize[LONGNOM]; char curmodulename[LONGNOM]; char vallengspec[LONGNOM]; char subroutinename[LONGNOM]; /******************************************************************************/ /**************** *** CONV Variables *** **********************************/ /******************************************************************************/ int dimprob ; /* dimension of the problem : 1 for 1D,2 for 2D, */ /* 3 for 3D */ int onlyfixedgrids; /* = 1 if onlyfixedgrids is true */ int todebug; int mark; int todebugfree; int fixedgrids; /* = 1 if fixedgrids is true */ char nbmaillesX[LONGNOM]; /* number of cells in the x direction */ char nbmaillesY[LONGNOM]; /* number of cells in the y direction */ char nbmaillesZ[LONGNOM]; /* number of cells in the z direction */ int IndicenbmaillesX; int IndicenbmaillesY; int IndicenbmaillesZ; int inmodulemeet; int incalldeclare; int aftercontainsdeclare; /* Signale si l'on vient d'un contains ou non */ int retour77; int colnum; int callagrifinitgrids; int callmpiinit; int firstpass; int couldaddvariable; int pointedvar; int agrif_parentcall; int didvariableadded; int SubloopScalar; /* = 1 we should put in argument of sub_loop */ /* only */ /* scalar and not table u(1,1,1) in place of u */ int checkexistcommon; int insubroutinedeclare; int inmoduledeclare; int dimsempty; int created_dimensionlist; char meetagrifinitgrids[LONGNOM]; char mpiinitvar[LONGNOM]; char *NameTamponfile; char toprintglob[LONGNOM]; char tmpvargridname[LONGLIGNE]; char EmptyChar[LONGNOM]; /* An empty char */ char curfilename[LONGNOM]; char nomfileoutput[LONGNOM]; char curbuf[100*LONGNOM]; char motparse[LONGNOM]; char motparse1[LONGNOM]; char charusemodule[LONGNOM]; char subofagrifinitgrids[LONGNOM]; char curfile[LONGNOM]; char mainfile[LONGNOM]; char nomdir[LONGNOM]; char commondirout[LONGNOM]; char commondirin[LONGNOM]; char filetoparse[LONGNOM]; FILE *fortranout; /* Output File */ FILE *fortranin; /* Input File */ FILE *oldfortranout; FILE *subloop; FILE *module_declar; FILE *allocationagrif; FILE *paramout; long int pos_cur; /* current position in the output file */ long int pos_curagrifparent; /* current position in the output file */ long int pos_curcall; /* current position in the output file */ long int pos_curuse; /* current position in the output file */ long int pos_curfunction; /* current position in the output file */ long int pos_cur_decl; /* current position in the output file */ long int pos_curdata; /* current position in the output file */ long int pos_curparameter;/* current position in the output file */ long int pos_curcommon; /* current position in the output file */ long int pos_cursave; /* current position in the output file */ long int pos_curdimension;/* current position in the output file */ long int pos_curinit; /* current position in the output file */ long int pos_curinclude; /* final position of a line in file */ long int pos_end; /* final position of a line in file */ long int pos_endsubroutine; /* final position of a line in file */ /******************************************************************************/ /*********** Declaration of externals subroutines *****************************/ /***************************************************** ************************/ /******************************************************************************/ /*********** convert.y ********************************************************/ /******************************************************************************/ extern int main(int argc,char *argv[]); /******************************************************************************/ /*********** fortran.y ********************************************************/ /******************************************************************************/ extern void processfortran(char *fichier_entree); /******************************************************************************/ /*********** dependfile.c *****************************************************/ /******************************************************************************/ extern void Writethedependnbxnbyfile(); extern void Readthedependnbxnbyfile(); extern void Writethedependlistofmoduleused(char *NameTampon ); extern void Readthedependlistofmoduleused(char *NameTampon); extern void WritedependParameterList(char *NameTampon ); extern listparameter *ReaddependParameterList(char *NameTampon, listparameter *listout); extern void Writethedependfile(char *NameTampon, listvar *input ); extern listvar *Readthedependfile( char *NameTampon , listvar *listout); extern void Write_Subroutine_For_Alloc(); extern void Read_Subroutine_For_Alloc(); extern void Writethedependavailablefile(); extern void Readthedependavailablefile(); extern int Did_filetoparse_readed(char *NameTampon); extern int Did_module_common_treaded(char *NameTampon); /******************************************************************************/ /*********** DiversListe.c ****************************************************/ /******************************************************************************/ extern void Add_Common_var_1(); extern listnom *Addtolistnom(char *nom, listnom *listin,int value); extern listname *Addtolistname(char *nom,listname *input); extern int ModuleIsDefineInInputFile(char *name); extern void Addmoduletothelisttmp(char *name); extern void Add_NameOfModule_1(char *nom); extern void Add_NameOfCommon_1(char *nom); extern void Add_CouplePointed_Var_1(char *namemodule,listcouple *couple); extern void Add_Include_1(char *name); extern void Add_ImplicitNoneSubroutine_1(); extern void WriteIncludeDeclaration(); extern void Add_Save_Var_1 (char *name,listdim *d); /******************************************************************************/ /*********** SubLoopCreation.c ************************************************/ /******************************************************************************/ extern void writeheadnewsub_0(int suborfunc); extern void WriteVariablelist_subloop(FILE *outputfile); extern void WriteVariablelist_subloop_Call(FILE *outputfile); extern void WriteVariablelist_subloop_Def(FILE *outputfile); extern void WriteHeadofSubroutineLoop(); extern void closeandcallsubloopandincludeit_0(int suborfun, char endsub[LONGNOM]); /******************************************************************************/ /*********** toamr.c **********************************************************/ /******************************************************************************/ extern char *variablenameroottabvars (variable * var); extern char *variablenametabvars (variable * var, int iorindice); extern char *variablecurgridtabvars (variable * var,int ParentOrCurgrid); extern char *vargridnametabvars (variable * var,int iorindice); extern char *vargridcurgridtabvars (variable * var,int ParentOrCurgrid); extern char *vargridcurgridtabvarswithoutAgrif_Gr (variable * var); extern char *vargridparam (variable * v, int whichone); extern void write_probdimagrif_file(); extern void write_keysagrif_file(); extern void write_modtypeagrif_file(); extern void write_createvarnameagrif_file(variable *v,FILE *createvarname, int *InitEmpty); extern void write_Setnumberofcells_file(); extern void write_Getnumberofcells_file(); extern void write_initialisationsagrif_file(variable *v,FILE *initproc, int *VarnameEmpty); extern void Write_Alloc_Agrif_Files(); extern int IndiceInlist(int indic, listindice *listin); extern void write_allocation_Common_0(); extern void write_allocation_Global_0(); extern void creefichieramr (char *NameTampon); /******************************************************************************/ /*********** UtilAgrif.c ******************************************************/ /******************************************************************************/ extern int Vartonumber(char *tokname); extern int Agrif_in_Tok_NAME(char *tokname); extern void ModifyTheVariableName_0(char *ident); extern void Add_SubroutineWhereAgrifUsed_1(char *sub,char *mod); extern void AddUseAgrifUtil_0(FILE *fileout); extern void AddUseAgrifUtilBeforeCall_0(FILE *fileout); extern void NotifyAgrifFunction_0(char *ident); extern void ModifyTheAgrifFunction_0(char *ident); extern void AgriffunctionModify_0(char *ident,int whichone); extern void Instanciation_0(char *ident); /******************************************************************************/ /*********** UtilCharacter.c **************************************************/ /******************************************************************************/ extern void FindAndChangeNameToTabvars(char name[LONGNOM],char toprint[LONGNOM], listvar * listtosee, int whichone); extern char *ChangeTheInitalvaluebyTabvarsName(char *nom,listvar *listtoread, int whichone); extern int IsVariableReal(char *nom); extern void IsVarInUseFile(char *nom); extern listnom *DecomposeTheNameinlistnom(char *nom, listnom * listout); extern void DecomposeTheName(char *nom); extern void convert2lower(char *name); /******************************************************************************/ /*********** UtilFile.c *******************************************************/ /******************************************************************************/ extern FILE * associate (char *filename); extern FILE * associateaplus (char *filename); extern long int setposcur(); extern long int setposcurinoldfortranout(); extern void copyuse_0(char *namemodule); extern void copyuseonly_0(char *namemodule); /******************************************************************************/ /*********** UtilFortran.c ****************************************************/ /******************************************************************************/ extern void initdimprob(int dimprobmod, char * nx, char * ny,char* nz); extern int Variableshouldberemove(char *nom); extern int variableisglobal(listvar *curvar, listvar *listin); extern int VariableIsInList(listvar *curvar,listvar *listin); extern void variableisglobalinmodule(listcouple *listin, char *module, FILE *fileout); extern void Remove_Word_Contains_0(); extern void Remove_Word_end_module_0(); extern void Write_Word_Contains_0(); extern void Write_Word_end_module_0(); extern void Add_Subroutine_For_Alloc(char *nom); extern void Write_Alloc_Subroutine_0(); extern void Write_Alloc_Subroutine_For_End_0(); extern void Write_GlobalParameter_Declaration_0(); extern void Write_NotGridDepend_Declaration_0(); extern int IsTabvarsUseInArgument_0(); extern int ImplicitNoneInSubroutine(); extern void Add_Pointer_Var_From_List_1(listvar *listin); extern void Add_Pointer_Var_1(char *nom); extern int varispointer_0(char *ident); extern int VariableIsNotFunction(char *ident); /******************************************************************************/ /*********** UtilListe.c ******************************************************/ /******************************************************************************/ extern void Init_Variable(variable *var); extern listvar * AddListvarToListvar(listvar *l,listvar *glob, int ValueFirstpass); extern void CreateAndFillin_Curvar(char *type,variable *curvar); extern void duplicatelistvar(listvar *orig); extern listdim * insertdim(listdim *lin,typedim nom); extern void change_dim_char(listdim *lin,listvar * l); extern int num_dims(listdim *d); extern variable * createvar(char *nom,listdim *d); extern listvar * insertvar(listvar *lin,variable *v); extern listvar *settype(char *nom,listvar *lin); /******************************************************************************/ /*********** UtilNotGridDep.c *************************************************/ /******************************************************************************/ extern void Add_NotGridDepend_Var_1 (char *name); extern int VarIsNonGridDepend(char *name); /******************************************************************************/ /*********** WorkWithAllocatelist.c *******************************************/ /******************************************************************************/ extern void Add_Allocate_Var_1(char *nom,char *nommodule); extern int IsVarAllocatable_0(char *ident); extern int varisallocatable_0(char *ident); /******************************************************************************/ /*********** WorkWithglobliste.c **********************************************/ /******************************************************************************/ extern void Add_Globliste_1(listvar *listtoadd); extern void Add_SubroutineDeclarationSave_Var_1(listvar *listtoadd); /******************************************************************************/ /*********** WorkWithlistdatavariable.c ***************************************/ /******************************************************************************/ extern void Add_Data_Var_1 (char *name,char *values); /******************************************************************************/ /*********** WorkWithlistmoduleinfile.c ***************************************/ /******************************************************************************/ /******************************************************************************/ /*********** WorkWithlistofmodulebysubroutine.c *******************************/ /******************************************************************************/ extern void RecordUseModulesVariables(); extern void RecordUseModulesUseModulesVariables(); extern void Add_NameOfModuleUsed_1(char *name); extern void Addmoduletothelist(char *name); extern void WriteUsemoduleDeclaration(); /******************************************************************************/ /*********** WorkWithlistvarindoloop.c ****************************************/ /******************************************************************************/ extern void Add_UsedInSubroutine_Var_1 (char *ident); extern void ajoutevarindoloop_definedimension (char *name); extern void ModifyThelistvarindoloop(); extern void CompleteThelistvarindoloop(); extern void CopyRecord(variable *var1,variable *var2); extern void Update_List_Subroutine_Var(listvar *list_to_modify); extern void Update_List_Global_Var_From_List_Save_Var(); extern void Update_List_From_Common_Var(listvar *list_to_modify); extern void Update_List_Var(listvar *list_to_modify); extern void List_UsedInSubroutine_Var_Update_From_Module_Used(); extern void Update_NotGridDepend_Var(listvar *list_to_modify); extern int LookingForVariableInList(listvar *listin,variable *var); extern int LookingForVariableInListGlobal(listvar *listin,variable *var); extern int LookingForVariableInListGlob(listvar *listin,variable *var); extern int LookingForVariableInListParamGlob(listparameter *listin, variable *var); extern void UpdateListDeclarationWithDimensionList(); extern void Clean_List_UsedInSubroutine_Var(); extern void Clean_List_SubroutineDeclaration_Var(); extern void ListClean(); extern void ListUpdate(); extern void Sort_List_SubroutineArgument_Var(); extern void IndiceTabvars_Global_Var_Treated(char *nom); extern void IndiceTabvars_Global_Var_No_Treated(char *nom); extern void UpdateTheRemainingList(listvar *record); extern void IndiceTabvars_Common_Var_Treated(char *nom); extern void IndiceTabvars_Common_Var_No_Treated(char *nom); extern void IndiceTabvarsIdentification(); extern void New_Allocate_Subroutine_Is_Necessary(); extern void New_Allocate_Subroutine_For_Common_Is_Necessary(); extern void NewModule_Creation_0(); extern void UpdateList_SubroutineWhereAgrifUsed(); extern void UpdateList_UsedInSubroutine_With_dimension(); extern void Affiche(); extern int SubInList_ContainsSubroutine(); /******************************************************************************/ /*********** WorkWithParameterlist.c ******************************************/ /******************************************************************************/ extern void Add_GlobalParameter_Var_1(listvar *listin); extern void Add_Parameter_Var_1(listvar *listin); extern void Add_Dimension_Var_1(listvar *listin); /******************************************************************************/ /*********** WorkWithvarofsubroutineliste.c ***********************************/ /******************************************************************************/ extern void Add_SubroutineArgument_Var_1(listvar *listtoadd); extern void Add_FunctionType_Var_1(char *nom); extern void Add_SubroutineDeclaration_Var_1 (listvar *listtoadd); /******************************************************************************/ /*********** Writedeclarations.c **********************************************/ /******************************************************************************/ extern void WriteBeginDeclaration(variable *v,char ligne[LONGLIGNE]); extern void WriteScalarDeclaration(variable *v,char ligne[LONGLIGNE]); extern void WriteTableDeclaration(variable * v,char ligne[LONGLIGNE],int tmpok); extern void writevardeclaration (listvar * var_record, FILE *fileout, int value); extern void WriteLocalParamDeclaration(); extern void WriteFunctionDeclaration(); extern void WriteSubroutineDeclaration(int value); extern void WriteArgumentDeclaration_beforecall(); extern void WriteArgumentDeclaration_Sort(); extern listnom *writedeclarationintoamr (listvar * deb_common, FILE *fileout, variable *var , char commonname[LONGNOM], listnom *neededparameter, char name_common[LONGNOM]); extern void writesub_loopdeclaration_scalar (listvar * deb_common, FILE *fileout); extern void writesub_loopdeclaration_tab (listvar * deb_common, FILE *fileout); /******************************************************************************/ /*********** WriteInFile.c ****************************************************/ /******************************************************************************/ extern void tofich_reste (FILE * filout, char *s,int returnlineornot); extern void tofich (FILE * filout, char *s, int returnlineornot); extern void tofich_blanc (FILE * filout, int size); extern void tofich_line (FILE * filout, int size, int long position); extern void RemoveWordSET_0(FILE * filout, long int position, long int sizetoremove); extern void RemoveWordCUR_0(FILE * filout, long int position, long int sizetoremove);