source: LMDZ5/trunk/makelmdz @ 1767

Last change on this file since 1767 was 1755, checked in by Ehouarn Millour, 12 years ago

Updates wich had been made on 'testing' branch (r1752) instead of trunk:
Add better handling of fcm path from makelmdz_fcm script to build_gcm script; and some translation of output messages to English.
EM

  • Property svn:executable set to *
File size: 17.3 KB
Line 
1#!/bin/bash
2#
3# $Id$
4#
5#
6########################################################################
7# for debug, uncomment line below
8#set -xv
9########################################################################
10# options par defaut pour la commande make
11########################################################################
12dim="96x72x19"
13physique=lmd
14code=gcm
15filtre=filtrez
16grille=reg
17couple=false
18veget=false
19chimie=false
20parallel=none
21paramem="par"
22compil_mod=prod
23io=ioipsl
24LIBPREFIX=""
25fcm_path=none
26cosp=false
27
28# guess a default 'arch'
29arch="local" # start with assuming we're on a local machine with local arch file
30## try to recognise machine and infer arch from it
31machine=`hostname`
32if [[ "$machine" == "brodie" ]]
33then
34  arch="SX8_BRODIE"
35fi
36if [[ "${machine:0:6}" == "vargas" ]]
37then
38  arch="PW6_VARGAS"
39fi
40if [[ "${machine:0:6}" == "ciclad" ]]
41then
42  arch="AMD64_CICLAD"
43fi
44if [[ "${machine:0:7}" == "platine" ]]
45then
46  arch="IA64_PLATINE"
47fi
48if [[ "${machine:0:6}" == "titane" ]]
49then
50  arch="X64_TITANE"
51fi
52if [[ "${machine:0:8}" == "mercure1" ]]
53then
54  arch="SX8_MERCURE"
55fi
56if [[ "${machine:0:8}" == "mercure2" ]]
57then
58  arch="SX9_MERCURE"
59fi
60
61LMDGCM=`pwd -P`
62LIBFGCM=$LMDGCM/libf
63LIBOGCM=$LMDGCM/libo
64if [[ ! -d $LIBOGCM ]]
65then
66  # create the directory
67  mkdir $LIBOGCM
68  if [[ ! $? ]]
69  then
70  echo "Failed to create directory $LIBOGCM"
71  exit
72  fi
73fi
74COSP_PATH=$LMDGCM/.void_dir
75
76
77
78localdir=`pwd -P`
79########################################################################
80#  Quelques initialisations de variables du shell.
81########################################################################
82
83CPP_KEY="" 
84INCLUDE='-I$(LIBF)/grid -I$(LIBF)/bibio -I$(LIBF)/filtrez -I. '
85LIB=""
86adjnt=""
87##COMPIL_FFLAGS="%PROD_FFLAGS"
88PARA_FFLAGS=""
89PARA_LD=""
90EXT_SRC=""
91
92########################################################################
93# lecture des options
94########################################################################
95
96while (($# > 0))
97  do
98  case $1 in
99      "-h") cat <<fin
100manuel complet sur http://...
101Usage :
102makegcm [options] exec
103[-h]                       : manuel abrege
104[-d [[IMx]JMx]LM]          : IM, JM, LM sont les dims en x, y, z (def: $dim)
105[-p PHYS]                  : compilation avec la physique libf/phyPHYS, (def: lmd)
106[-prod / -dev / -debug]    : compilation en mode production (default) / developpement / debug .
107[-c false/MPI1/MPI2]       : couple ocean : MPI1/MPI2/false (def: false)
108[-v false/true]            : avec ou sans vegetation (def: false)
109[-chimie INCA/false]       : avec ou sans model de chimie INCA (def: false)
110[-parallel none/mpi/omp/mpi_omp] : parallelisation (default: none) : mpi, openmp ou mixte mpi_openmp
111[-g GRI]                   : conf. grille dans dyn3d/GRI_xy.h  (def: reg inclue un zoom)
112[-io IO]                   : choix d une librairie I/O, experts (def: ioipsl)
113[-include INCLUDES]        : variables supplementaires pour include
114[-cpp CPP_KEY]             : cle cpp supplementaires
115[-adjnt]                   : adjoint, a remettre en route ...
116[-mem]                     : version memoire reduite (si en mode parallele)
117[-filtre NOMFILTRE]        : prend le filtre dans libf/NOMFILTRE (def: filtrez)
118[-link LINKS]              : liens optionels avec d autres librairies
119[-ext_src path]            : chemin d un repertoire source avec des sources externe a compiler avec le modele
120[-arch nom_arch]           : nom de l architecture cible
121 exec                      : executable genere
122fin
123          exit;;
124      "-d")
125          dim=$2 ; shift ; shift ;;
126     
127      "-O")
128          echo "option obsolete dans ce makegcm"
129          exit;;
130
131      "-p")
132          physique="$2" ;  shift ; shift ;;
133
134      "-g")
135          grille="$2" ; shift ; shift ;;
136
137      "-c")
138          couple="$2" ; shift ; shift ;;
139
140      "-prod")
141          compil_mod="prod" ; shift ;;
142
143      "-dev")
144          compil_mod="dev" ; shift ;;
145
146      "-debug")
147          compil_mod="debug" ; shift ;;
148
149      "-io")
150          io="$2" ; shift ; shift ;;
151
152      "-v")
153          veget="$2" ; shift ; shift ;;
154
155      "-chimie")
156          chimie="$2" ; shift ; shift ;;
157
158      "-parallel")
159          parallel="$2" ; shift ; shift ;;
160     
161      "-include")
162          INCLUDE="$INCLUDE -I$2" ; shift ; shift ;;
163
164      "-cpp")
165          CPP_KEY="$CPP_KEY $2" ; shift ; shift ;;
166
167      "-adjnt")
168          echo "option a reactiver ";exit
169          opt_dep="$opt_dep adjnt" ; adjnt="-ladjnt -ldyn3d "
170          optim="$optim -Dadj" ; shift ;;
171
172      "-cosp")
173          cosp="$2" ; shift ; shift ;;
174     
175      "-mem")
176          paramem="mem" ; shift ;;
177
178      "-filtre")
179          filtre=$2 ; shift ; shift ;;
180
181      "-link")
182          LIB="$LIB $2" ; shift ; shift ;;
183
184      "-fcm_path")
185          fcm_path=$2 ; shift ; shift ;;
186
187      "-ext_src")
188          EXT_SRC=$2 ; shift ; shift ;;
189
190      "-arch")
191          arch=$2 ; shift ; shift ;;
192
193      *)
194          code="$1" ; shift ;;
195  esac
196done
197
198###############################################################
199# lecture des chemins propres à l'architecture de la machine #
200###############################################################
201rm -f .void_file
202echo > .void_file
203rm -rf .void_dir
204mkdir .void_dir
205rm -f arch.path
206if [[ -r arch/arch-${arch}.path ]]
207then
208  ln -s arch/arch-${arch}.path ./arch.path
209  source arch.path
210else
211  echo "Error: missing arch/arch-${arch}.path file !"
212  exit
213fi
214rm -f arch.fcm
215if [[ -r arch/arch-${arch}.fcm ]]
216then
217  ln -s arch/arch-${arch}.fcm arch.fcm
218else
219  echo "Error: missing arch/arch-${arch}.fcm file !"
220  exit
221fi
222########################################################################
223# Definition des clefs CPP, des chemins des includes et modules
224#  et des libraries
225########################################################################
226
227# basic compile flags from arch.fcm file
228archfileline=$( grep -i '^%BASE_FFLAGS' arch.fcm )
229COMPIL_FFLAGS=$( echo ${archfileline##%BASE_FFLAGS} )
230
231# other compile flags, depending on compilation mode
232if [[ "$compil_mod" == "prod" ]]
233then
234## read COMPIL_FFLAGS from arch.fcm file
235  archfileline=$( grep -i '^%PROD_FFLAGS' arch.fcm )
236  archfileopt=$( echo ${archfileline##%PROD_FFLAGS} )
237  COMPIL_FFLAGS="${COMPIL_FFLAGS} ${archfileopt}"
238elif [[ "$compil_mod" == "dev" ]]
239then
240## read %DEV_FFLAGS from arch.fcm file
241  archfileline=$( grep -i '^%DEV_FFLAGS' arch.fcm )
242  archfileopt=$( echo ${archfileline##%DEV_FFLAGS} )
243  COMPIL_FFLAGS="${COMPIL_FFLAGS} ${archfileopt}"
244elif [[ "$compil_mod" == "debug" ]]
245then
246## read %DEBUG_FFLAGS from arch.fcm file
247  archfileline=$( grep -i '^%DEBUG_FFLAGS' arch.fcm )
248  archfileopt=$( echo ${archfileline##%DEBUG_FFLAGS} )
249  COMPIL_FFLAGS="${COMPIL_FFLAGS} ${archfileopt}"
250fi
251
252# add CPP_KEY defined in arch.fcm file
253archfileline=$( grep -i '^%FPP_DEF' arch.fcm )
254archfileopt=$( echo ${archfileline##%FPP_DEF} )
255CPP_KEY="$CPP_KEY ${archfileopt}"
256
257# get compiler name from arch.fcm file
258archfileline=$( grep -i '^%COMPILER' arch.fcm )
259fcompiler=$( echo ${archfileline##%COMPILER} )
260
261# get linker name from arch.fcm file
262archfileline=$( grep -i '^%LINK' arch.fcm )
263linker=$( echo ${archfileline##%LINK} )
264
265# get ar command from arch.fcm file
266archfileline=$( grep -i '^%AR' arch.fcm )
267arcommand=$( echo ${archfileline##%AR} )
268
269# get make utility from arch.fcm file
270archfileline=$( grep -i '^%MAKE' arch.fcm )
271makecommand=$( echo ${archfileline##%MAKE} )
272
273# get basic libraries to link with arch.fcm file
274archfileline=$( grep -i '^%BASE_LD' arch.fcm )
275archfileopt=$( echo ${archfileline##%BASE_LD} )
276LIB="$LIB  ${archfileopt}"
277
278if [[ "$physique" != "nophys" ]]
279then
280   #We'll use some physics
281   CPP_KEY="$CPP_KEY CPP_PHYS"
282   if [[ "${physique:0:3}" == "lmd" ]]
283   then
284   #For lmd physics, default planet type is Earth
285   CPP_KEY="$CPP_KEY CPP_EARTH"
286   fi
287fi
288
289if [[ "$chimie" == "INCA" ]]
290then
291   CPP_KEY="$CPP_KEY INCA"
292   INCLUDE="$INCLUDE -I${INCA_INCDIR}"
293   LIB="$LIB -L${INCA_LIBDIR} -lchimie"
294   libchimie=" -L${INCA_LIBDIR} -lchimie"
295fi
296
297if [[ "$couple" != "false" ]]
298then
299   CPP_KEY="$CPP_KEY CPP_COUPLE"
300   INCLUDE="$INCLUDE -I${OASIS_INCDIR}"
301   LIB="$LIB -L${OASIS_LIBDIR} -lpsmile.${couple} -lmpp_io"
302fi
303
304if [[ "$parallel" == "none" ]]
305then
306  FLAG_PARA=''
307else
308  FLAG_PARA="par"
309fi
310
311if [[ "$parallel" == "mpi" ]]
312then
313   CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI"
314  # MPI additional compilation options
315  archfileline=$( grep -i '^%MPI_FFLAGS' arch.fcm )
316  PARA_FFLAGS=$( echo ${archfileline##%MPI_FFLAGS} )
317  # MPI additional links
318  archfileline=$( grep -i '^%MPI_LD' arch.fcm )
319  PARA_LD=$( echo ${archfileline##%MPI_LD} )
320elif [[ "$parallel" == "omp" ]]
321then
322   CPP_KEY="$CPP_KEY CPP_PARA CPP_OMP"
323  # OMP additional compilation options
324  archfileline=$( grep -i '^%OMP_FFLAGS' arch.fcm )
325  PARA_FFLAGS=$( echo ${archfileline##%OMP_FFLAGS} )
326  # OMP additional links
327  archfileline=$( grep -i '^%OMP_LD' arch.fcm )
328  PARA_LD=$( echo ${archfileline##%OMP_LD} )
329elif [[ "$parallel" == "mpi_omp" ]]
330then
331   CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI CPP_OMP"
332  # MPI additional compilation options
333  archfileline=$( grep -i '^%MPI_FFLAGS' arch.fcm )
334  PARA_FFLAGS=$( echo ${archfileline##%MPI_FFLAGS} )
335  # OMP additional compilation options
336  archfileline=$( grep -i '^%OMP_FFLAGS' arch.fcm )
337  PARA_FFLAGS="${PARA_FFLAGS} "$( echo $archfileopt ${archfileline##%OMP_FFLAGS} )
338  # MPI additional links
339  archfileline=$( grep -i '^%MPI_LD' arch.fcm )
340  PARA_LD=$( echo ${archfileline##%MPI_LD} )
341  # OMP additional links
342  archfileline=$( grep -i '^%OMP_LD' arch.fcm )
343  PARA_LD="${PARA_LD} "$( echo $archfileopt ${archfileline##%OMP_LD} )
344fi
345
346if [[ ( "$parallel" == "omp" || "$parallel" == "mpi_omp" ) \
347   && "$compil_mod" == "debug" ]]
348then
349    echo "Usually, parallelization with OpenMP requires some optimization."
350    echo "We suggest switching to \"-dev\"."
351fi
352
353if [[ "$veget" == "true" ]]
354then
355   CPP_KEY="$CPP_KEY CPP_VEGET"
356   INCLUDE="${INCLUDE} -I${ORCH_INCDIR}"
357   LIB="${LIB} -L${ORCH_LIBDIR} -l${LIBPREFIX}sechiba -l${LIBPREFIX}parameters -l${LIBPREFIX}stomate -l${LIBPREFIX}parallel -l${LIBPREFIX}orglob"
358fi
359
360if [[ $io == ioipsl ]]
361then
362   CPP_KEY="$CPP_KEY CPP_IOIPSL"
363   INCLUDE="$INCLUDE -I${IOIPSL_INCDIR}"
364   LIB="$LIB -L${IOIPSL_LIBDIR} -l${LIBPREFIX}ioipsl"
365fi
366
367if [[ "$cosp" == "true" ]]
368then
369   CPP_KEY="$CPP_KEY CPP_COSP"
370   COSP_PATH="$LIBFGCM/cosp"
371#   LIB="${LIB} -l${LIBPREFIX}cosp"
372   opt_dep="$opt_dep cosp"
373   lcosp="-l${LIBPREFIX}cosp"
374   INCLUDE="$INCLUDE"' -I$(LIBF)/cosp'
375fi
376
377INCLUDE="$INCLUDE ${NETCDF_INCDIR}"
378LIB="$LIB ${NETCDF_LIBDIR}"
379
380########################################################################
381# calcul du nombre de dimensions
382########################################################################
383
384
385dim_full=$dim
386dim=`echo $dim | sed -e 's/[^0-9]/ /g'` 
387set $dim
388dimc=$#
389echo calcul de la dimension
390echo dim $dim
391echo dimc $dimc
392
393
394########################################################################
395# Gestion des dimensions du modele.
396# on cree ou remplace le fichier des dimensions
397########################################################################
398
399cd $LIBFGCM/grid
400if [[ -f dimensions.h ]]
401then
402  echo 'ATTENTION: vous etes sans doute en train de compiler le modele par ailleurs'
403  echo "Attendez que la premiere compilation soit terminee pour relancer la suivante."
404  echo "Si vous etes sur que vous ne compilez pas le modele par ailleurs,"
405  echo  vous pouvez continuer en repondant oui.
406  echo "Voulez-vous vraiment continuer?"
407  echo ""
408  echo "WARNING: you are probably already compiling the model somewhere else."
409  echo "Wait until the first compilation is finished before launching this one."
410  echo "If you are sure that you are not compiling elsewhere, just answer "
411  echo "yes (or 'oui') to the question below to proceed."
412  echo "Do you wish to continue?"
413  read reponse
414  if [[ $reponse == "oui" || $reponse == "yes" ]]
415  then
416    \rm -f $LIBFGCM/grid/dimensions.h
417  else
418    exit
419  fi
420fi
421
422
423cd $LIBFGCM/grid/dimension
424./makdim $dim
425cat $LIBFGCM/grid/dimensions.h
426cd $LMDGCM
427
428
429########################################################################
430# Differentes dynamiques (3d, 2d, 1d)
431########################################################################
432
433dimension=`echo $dim | wc -w`
434echo dimension $dimension
435
436if (( $dimension == 3 ))
437then
438  cd $LIBFGCM/grid
439  \rm fxyprim.h
440  cp -p fxy_${grille}.h fxyprim.h
441else
442  echo "Probleme dans les dimensions de la dynamique !!"
443  echo "Non reactive pour l'instant !!!"
444fi
445
446######################################################################
447# Gestion du filtre qui n'existe qu'en 3d.
448######################################################################
449
450if (( `expr $dimc \> 2` == 1 ))
451then
452   filtre="FILTRE=$filtre"
453else
454   filtre="FILTRE= L_FILTRE= "
455fi
456echo MACRO FILTRE $filtre
457
458echo $dimc
459
460######################################################################
461# Creation du suffixe de la configuration
462######################################################################
463
464
465SUFF_NAME=_${dim_full}
466SUFF_NAME=${SUFF_NAME}_phy${physique}
467
468if [[ "$parallel" != "none" ]]
469then
470  SUFF_NAME=${SUFF_NAME}_para
471  DYN=dyn${dimc}d${paramem}
472  if [[ "$paramem" == "mem" ]]
473  then
474   SUFF_NAME=${SUFF_NAME}_${paramem}
475  fi
476else
477  SUFF_NAME=${SUFF_NAME}_seq
478  DYN=dyn${dimc}d
479fi
480
481if [[ $veget == "true" ]]
482then
483  SUFF_NAME=${SUFF_NAME}_orch
484fi
485
486if [[ $couple != "false" ]]
487then
488  SUFF_NAME=${SUFF_NAME}_couple
489fi
490
491if [[ $chimie == "INCA" ]]
492then
493  SUFF_NAME=${SUFF_NAME}_inca
494fi
495
496cd $LMDGCM
497
498
499########################################################################
500#  Avant de lancer le make, on recree le makefile si necessaire
501########################################################################
502########################################################################
503# c'est a dire dans 3 cas:
504# 1. si la liste des fichiers .F et .h a ete modifiee depuis la
505#    derniere creation du makefile
506# 2. si le fichier contenant cette liste "liste_des_sources"
507#    n'existe pas.
508# 3. Si le makefile n'existe pas.
509########################################################################
510cd $LMDGCM
511find libf -name '*.[Fh]' -print > tmp77
512find libf -name '*.[Fh]' -exec egrep -i " *use *ioipsl" {} \; -print > tmp90
513find libf -name '*.[Fh90]' -print >> tmp90
514
515if [[ ! ( -r makefile ) || ! ( -r liste_des_sources_f90 ) || ! ( -r liste_des_sources_f77 ) || ` diff tmp77 liste_des_sources_f77 | wc -w ` -ne 0 || ` diff tmp90 liste_des_sources_f90 | wc -w ` -ne 0 ]]
516then
517  echo "les fichiers suivants ont ete crees ou detruits"
518  echo "ou les fichiers suivants sont passes ou ne sont plus en Fortran 90"
519  diff liste_des_sources_f77 tmp77
520  diff liste_des_sources_f90 tmp90
521  \cp -f tmp77 liste_des_sources_f77
522  \cp -f tmp90 liste_des_sources_f90
523  echo "on recree le makefile"
524  ./create_make_gcm > tmp
525  \mv -f tmp makefile
526  echo "Nouveau makefile cree"
527fi
528
529#################################################################
530# Preparation de l'execution de la comande make
531#################################################################
532
533source_code=${code}.F
534if [[ -r $LMDGCM/libf/dyn${dimc}d${FLAG_PARA}/${code}.F90 ]]
535then
536  source_code=${code}.F90
537fi
538
539# library directory name:
540if [[ "$parallel" == "none" ]]
541then 
542  nomlib=${arch}_${physique}_${dim_full}_${grille}_${compil_mod}
543else
544  nomlib=${arch}_${physique}_${dim_full}_${grille}_${compil_mod}_${FLAG_PARA}
545fi
546
547if [[ ! -d "${LIBOGCM}/${nomlib}" ]]
548then
549  mkdir ${LIBOGCM}/${nomlib}
550  # check we indeed managed to create the directory
551  if [[ ! $? ]]
552  then
553    echo "Error: could not create directory ${LIBOGCM}/${nomlib}"
554    exit
555  fi
556fi
557
558# where module files are created
559mod_loc_dir=$localdir
560
561if [[ "$physique" != "nophys" ]]
562then
563  INCLUDE="$INCLUDE"' -I$(LIBF)/phy'"$physique"
564fi
565INCLUDE="$INCLUDE"' -I$(LIBF)/dyn'${dimc}'d'$FLAG_PARA' -I'${LIBOGCM}/${nomlib}
566
567# ranlib utility (check it exists or else default to ls)
568if [[ `which ranlib > /dev/null 2>&1 ; echo $?` -eq 0 ]]
569then
570  ranlib="ranlib"
571else
572  ranlib="ls"
573fi
574
575# add CPP keys to COMPIL_FLAGS
576# (but first add -D before all CPP_KEY items)
577cpp_definitions=`echo $CPP_KEY | sed -e 's/[A-Za-z_=0-9]*/-D&/g'`
578# (but add a -WF,-D before all CPP_KEY items) => for xlf on Vargas
579if [[ "${fcompiler:0:3}" == "xlf" ]]
580then
581cpp_definitions=`echo $CPP_KEY | sed -e 's/[A-Za-z_=0-9]*/-WF,-D&/g'`
582fi
583COMPIL_FFLAGS="${COMPIL_FFLAGS} ${cpp_definitions}"
584
585#################################################################
586# Execution du make
587#################################################################
588echo $makecommand RANLIB=$ranlib -f $LMDGCM/makefile \
589OPTION_DEP="$opt_dep" OPTION_LINK="$LIB ${PARA_LD}" \
590OPTIM90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
591OPTIMTRU90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
592OPTIM="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
593INCLUDE="$INCLUDE" \
594$filtre \
595LIBO=${LIBOGCM}/${nomlib} \
596"PHYS=$physique" \
597DIM=$dimc \
598FLAG_PARA=$FLAG_PARA \
599L_ADJNT=$adjnt \
600L_COSP="$lcosp" \
601L_CHIMIE="$libchimie" \
602LOCAL_DIR="$localdir"  \
603F77="$fcompiler" \
604F90="$fcompiler" \
605OPLINK="$LIB" \
606LINK="$linker" \
607GCM="$LMDGCM" \
608MOD_LOC_DIR=$mod_loc_dir \
609MOD_SUFFIX="mod" \
610AR=$arcommand \
611SOURCE=$source_code \
612PROG=$code
613
614$makecommand RANLIB=$ranlib -f $LMDGCM/makefile \
615OPTION_DEP="$opt_dep" OPTION_LINK="$LIB ${PARA_LD}" \
616OPTIM90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
617OPTIMTRU90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
618OPTIM="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
619INCLUDE="$INCLUDE" \
620$filtre \
621LIBO=${LIBOGCM}/${nomlib} \
622"PHYS=$physique" \
623DIM=$dimc \
624FLAG_PARA=$FLAG_PARA \
625L_ADJNT="$adjnt" \
626L_COSP="$lcosp" \
627L_CHIMIE="$libchimie" \
628LOCAL_DIR="$localdir"  \
629F77="$fcompiler" \
630F90="$fcompiler" \
631OPLINK="$LIB" \
632LINK="$linker" \
633GCM="$LMDGCM" \
634MOD_LOC_DIR=$mod_loc_dir \
635MOD_SUFFIX="mod" \
636AR=$arcommand \
637SOURCE=$source_code \
638PROG=$code
639
640if [[ -r $LIBFGCM/grid/dimensions.h ]]
641then
642  # Cleanup: remove dimension.h file
643  \rm -f $LIBFGCM/grid/dimensions.h
644fi
Note: See TracBrowser for help on using the repository browser.