source: LMDZ5/branches/LF-private/makelmdz_fcm @ 2543

Last change on this file since 2543 was 1869, checked in by Laurent Fairhead, 11 years ago

Suite intégration SISVAT: ne pas compiler SISVAT si on n'en a pas besoin quand
makelmdz_fcm est utilisé


Follow-up on SISVAT integration: do not compile SISVAT if not needed when using
makelmdz_fcm

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 14.0 KB
Line 
1#!/bin/bash
2# $Id: makelmdz_fcm 1869 2013-09-16 08:13:50Z jbmadeleine $
3# This is a script in Bash.
4
5# FH : on ne crée plus le fichier arch.mk qui est supposé exister par
6# FH : ailleurs.
7# FH : ulterieurement, ce fichier sera pré-existant pour une série
8# FH : de configurations en versions optimisées et debug qui seront
9# FH : liés (ln -s) avec arch.mk en fonction de l'architecture.
10# FH : Pour le moment, cette version est en test et on peut créer les
11# FH : arch.mk en lançant une première fois makegcm.
12#
13##set -x
14########################################################################
15# options par defaut pour la commande make
16########################################################################
17
18dim="96x72x19"
19physique=lmd
20filtre=filtrez
21grille=reg
22couple=false
23veget=false
24sisvat=false
25chimie=false
26parallel=none
27paramem="par"
28compil_mod=prod
29io=ioipsl
30LIBPREFIX=""
31cosp=false
32job=1
33full=''
34
35LMDGCM=`/bin/pwd`
36LIBOGCM=$LMDGCM/libo
37LIBFGCM=$LMDGCM/libf
38COSP_PATH=$LMDGCM/.void_dir
39fcm_path=$LMDGCM/tools/fcm/bin
40
41########################################################################
42#  Quelques initialisations de variables du shell.
43########################################################################
44
45CPP_KEY="" 
46INCLUDE=""
47LIB=""
48adjnt=""
49COMPIL_FFLAGS="%PROD_FFLAGS"
50PARA_FFLAGS=""
51PARA_LD=""
52EXT_SRC=""
53
54########################################################################
55# lecture des options de mymake
56########################################################################
57
58while (($# > 0))
59  do
60  case $1 in
61      "-h") cat <<fin
62Usage :
63makelmdz_fcm [options] -arch nom_arch exec
64[-h]                       : brief help
65[-d [[IMx]JMx]LM]          : IM, JM, LM are the dimensions in x, y, z (default: $dim)
66[-p PHYS]                  : set of physical parametrizations (in libf/phyPHYS), (default: lmd)
67[-prod / -dev / -debug]    : compilation mode production (default) / developement / debug
68[-c false/MPI1/MPI2]       : coupling with ocean model : MPI1/MPI2/false (default: false)
69[-v false/orchidee2.0/orchidee1.9/true] : version of the vegetation model to include (default: false)
70          false       : no vegetation model
71          orchidee2.0 : compile using ORCHIDEE 2.0 (or more recent version)
72          orchidee1.9 : compile using ORCHIDEE up to the version including OpenMP in ORCHIDEE : tag 1.9-1.9.5(version AR5)-1.9.6
73          true        : (obsolete; for backward compatibility) use ORCHIDEE tag 1.9-1.9.6
74[-chimie INCA/false]       : with INCA chemistry model or without (default: false)
75[-parallel none/mpi/omp/mpi_omp] : parallelism (default: none) : mpi, openmp or mixted mpi_openmp
76[-g GRI]                   : grid configuration in dyn3d/GRI_xy.h  (default: reg, inclues a zoom)
77[-io IO]                   : Input/Output library (default: ioipsl)
78[-include INCLUDES]        : extra include path to add
79[-cpp CPP_KEY]             : additional preprocessing definitions
80[-adjnt]                   : adjoint model, not operational ...
81[-mem]                     : reduced memory dynamics (if in parallel mode)
82[-filtre NOMFILTRE]        : use filtre from libf/NOMFILTRE (default: filtrez)
83[-link LINKS]              : additional links with other libraries
84[-j n]                     : active parallel compiling on ntask
85[-full]                    : full recompiling
86[-fcm_path path]           : path to the fcm tool (default: tools/fcm/bin)
87[-ext_src path]            : path to an additional set of routines to compile with the model
88 -arch nom_arch            : target architecture
89 exec                      : executable to build
90fin
91          exit;;
92
93      "-d")
94          dim=$2 ; shift ; shift ;;
95     
96      "-p")
97          physique="$2" ;  shift ; shift ;;
98
99      "-g")
100          grille="$2" ; shift ; shift ;;
101
102      "-c")
103          couple="$2" ; shift ; shift ;;
104
105      "-prod")
106          compil_mod="prod" ; shift ;;
107
108      "-dev")
109          compil_mod="dev" ; shift ;;
110
111      "-debug")
112          compil_mod="debug" ; shift ;;
113
114      "-io")
115          io="$2" ; shift ; shift ;;
116
117      "-v")
118          veget="$2" ; shift ; shift ;;
119
120      "-sisvat")
121          sisvat="$2" ; shift ; shift ;;
122
123      "-chimie")
124          chimie="$2" ; shift ; shift ;;
125
126      "-parallel")
127          parallel="$2" ; shift ; shift ;;
128     
129      "-include")
130          INCLUDE="$INCLUDE -I$2" ; shift ; shift ;;
131
132      "-cpp")
133          CPP_KEY="$CPP_KEY $2" ; shift ; shift ;;
134
135      "-adjnt")
136          echo "not operational ... work to be done here ";exit
137          opt_dep="$opt_dep adjnt" ; adjnt="-ladjnt -ldyn3d "
138          optim="$optim -Dadj" ; shift ;;
139
140      "-cosp")
141          cosp="$2" ; shift ; shift ;;
142     
143      "-mem")
144          paramem="mem" ; shift ;;
145
146      "-filtre")
147          filtre=$2 ; shift ; shift ;;
148
149      "-link")
150          LIB="$LIB $2" ; shift ; shift ;;
151
152      "-fcm_path")
153          fcm_path=$2 ; shift ; shift ;;
154
155      "-ext_src")
156          EXT_SRC=$2 ; shift ; shift ;;
157      "-j")
158          job=$2 ; shift ; shift ;;
159      "-full")
160          full="-full" ; shift ;;
161
162      "-arch")
163          arch=$2 ; shift ; shift ;;
164
165      *)
166          code="$1" ; shift ;;
167  esac
168done
169
170###############################################################
171# path to fcm
172###############################################################
173# handle case when provided path to fcm was given as a relative
174# path (from makelmdz_fcm script directory) and not an absolute path
175if [[ ${fcm_path:0:1} != "/" ]] ; then
176  # prepend with makelmdz_fcm location
177  fcm_path=$(cd $(dirname $0) ; pwd)"/"${fcm_path}
178fi
179
180# add fcm_path to PATH
181export PATH=${fcm_path}:${PATH}
182
183echo "Path to fcm:"
184echo ${fcm_path}
185
186###############################################################
187# lecture des chemins propres à l'architecture de la machine #
188###############################################################
189rm -f .void_file
190echo > .void_file
191rm -rf .void_dir
192mkdir .void_dir
193rm -f arch.path
194ln -s arch/arch-${arch}.path ./arch.path
195source arch.path
196
197########################################################################
198# Definition des clefs CPP, des chemins des includes et modules
199#  et des libraries
200########################################################################
201
202if [[ "$compil_mod" == "prod" ]]
203then
204  COMPIL_FFLAGS="%PROD_FFLAGS"
205elif [[ "$compil_mod" == "dev" ]]
206then
207  COMPIL_FFLAGS="%DEV_FFLAGS"
208elif [[ "$compil_mod" == "debug" ]]
209then
210  COMPIL_FFLAGS="%DEBUG_FFLAGS"
211fi
212
213if [[ "$physique" != "nophys" ]]
214then
215   #We'll use some physics
216   CPP_KEY="$CPP_KEY CPP_PHYS"
217   if [[ "${physique:0:3}" == "lmd" ]]
218   then
219   #For lmd physics, default planet type is Earth
220   CPP_KEY="$CPP_KEY CPP_EARTH"
221   fi
222fi
223
224if [[ "$chimie" == "INCA" ]]
225then
226   CPP_KEY="$CPP_KEY INCA"
227   INCLUDE="$INCLUDE -I${INCA_INCDIR}"
228   LIB="$LIB -L${INCA_LIBDIR} -lchimie"
229fi
230
231if [[ "$couple" != "false" ]]
232then
233   CPP_KEY="$CPP_KEY CPP_COUPLE"
234   INCLUDE="$INCLUDE -I${OASIS_INCDIR}"
235   LIB="$LIB -L${OASIS_LIBDIR} -lpsmile.${couple} -lmpp_io"
236fi
237
238if [[ "$parallel" == "mpi" ]]
239then
240   CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI"
241   PARA_FFLAGS="%MPI_FFLAGS"
242   PARA_LD="%MPI_LD"
243elif [[ "$parallel" == "omp" ]]
244then
245   CPP_KEY="$CPP_KEY CPP_PARA CPP_OMP"
246   PARA_FFLAGS="%OMP_FFLAGS"
247   PARA_LD="%OMP_LD"
248elif [[ "$parallel" == "mpi_omp" ]]
249then
250   CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI CPP_OMP"
251   PARA_FFLAGS="%MPI_FFLAGS %OMP_FFLAGS"
252   PARA_LD="%MPI_LD %OMP_LD"
253fi
254
255if [[ ( "$parallel" == "omp" || "$parallel" == "mpi_omp" ) \
256   && "$compil_mod" == "debug" ]]
257then
258    echo "Usually, parallelization with OpenMP requires some optimization."
259    echo "We suggest switching to \"-dev\"."
260fi
261
262if [ "$veget" = "true" -o "$veget" = "orchidee1.9" -o "$veget" = "orchidee2.0" ]
263then
264#NB: option 'true': for backward compatibility. To be used with ORCHIDEE tag 1.9-1.9.6
265#    For this case, cpp flag ORCHIDEE_NOOPENMP must be added to the makelmdz_fcm arguments
266#    option orchidee1.9 : Compile with ORCHIDEE version up to the inclusion of OpenMP in ORCHIDEE : tag 1.9-1.9.5(version AR5)-1.9.6
267   INCLUDE="${INCLUDE} -I${ORCH_INCDIR}"
268   CPP_KEY="$CPP_KEY CPP_VEGET"
269# temporary, for Orchidee versions 1.9.* (before openmp activation)
270   if [[ "$veget" == "orchidee1.9" ]] ; then
271      CPP_KEY="$CPP_KEY ORCHIDEE_NOOPENMP"
272   fi
273   if [[ "$veget" == "orchidee2.0" ]] ; then
274      orch_libs="sechiba parameters stomate parallel orglob orchidee"
275   else
276      orch_libs="sechiba parameters stomate parallel orglob"
277   fi
278   LIB="${LIB} -L${ORCH_LIBDIR}"
279   for lib in ${orch_libs} ; do
280      if [ -f ${ORCH_LIBDIR}/lib${LIBPREFIX}$lib.a ] ; then
281         LIB="${LIB} -l${LIBPREFIX}$lib "
282      fi
283   done
284elif [[ "$veget" != "false" ]] ; then
285   echo "Option -v $veget does not exist"
286   echo "Use ./makelmdz_fcm -h for more information"
287   exit 
288fi
289
290if [[ "$sisvat" == "true" ]]
291then
292   CPP_KEY="$CPP_KEY CPP_SISVAT"
293   sed -e 's/^#src::sisvat/src::sisvat/' bld.cfg > bld.tmp
294   mv bld.tmp bld.cfg
295fi
296
297if [[ $io == ioipsl ]]
298then
299   CPP_KEY="$CPP_KEY CPP_IOIPSL"
300   INCLUDE="$INCLUDE -I${IOIPSL_INCDIR}"
301   LIB="$LIB -L${IOIPSL_LIBDIR} -l${LIBPREFIX}ioipsl"
302fi
303if [[ "$cosp" == "true" ]]
304then
305   CPP_KEY="$CPP_KEY CPP_COSP"
306   COSP_PATH="$LIBFGCM/cosp"
307#   LIB="${LIB} -l${LIBPREFIX}cosp"
308fi
309
310INCLUDE="$INCLUDE ${NETCDF_INCDIR}"
311LIB="$LIB ${NETCDF_LIBDIR}"
312
313########################################################################
314# calcul du nombre de dimensions
315########################################################################
316
317
318dim_full=$dim
319dim=`echo $dim | sed -e 's/[^0-9]/ /g'` 
320set $dim
321dimc=$#
322echo calcul de la dimension
323echo dim $dim
324echo dimc $dimc
325
326
327########################################################################
328# Gestion des dimensions du modele.
329# on cree ou remplace le fichier des dimensions
330########################################################################
331
332cd $LIBFGCM/grid
333if [[ -f dimensions.h ]]
334then
335  echo 'ATTENTION: vous etes sans doute en train de compiler le modele par ailleurs'
336  echo "Attendez que la premiere compilation soit terminee pour relancer la suivante."
337  echo "Si vous etes sur que vous ne compilez pas le modele par ailleurs,"
338  echo  vous pouvez continuer en repondant oui.
339  echo "Voulez-vous vraiment continuer?"
340  echo ""
341  echo "WARNING: you are probably already compiling the model somewhere else."
342  echo "Wait until the first compilation is finished before launching this one."
343  echo "If you are sure that you are not compiling elsewhere, just answer "
344  echo "yes (or 'oui') to the question below to proceed."
345  echo "Do you wish to continue?"
346  read reponse
347  if [[ $reponse == "oui" || $reponse == "yes" ]]
348  then
349    \rm -f $LIBFGCM/grid/dimensions.h
350  else
351    exit
352  fi
353fi
354
355
356cd $LIBFGCM/grid/dimension
357./makdim $dim
358cat $LIBFGCM/grid/dimensions.h
359cd $LMDGCM
360
361
362########################################################################
363# Differentes dynamiques (3d, 2d, 1d)
364########################################################################
365
366dimension=`echo $dim | wc -w`
367echo dimension $dimension
368
369if (( $dimension == 3 ))
370then
371  cd $LIBFGCM/grid
372  \rm fxyprim.h
373  cp -p fxy_${grille}.h fxyprim.h
374else
375  echo "Probleme dans les dimensions de la dynamique !!"
376  echo "Non reactive pour l'instant !!!"
377fi
378
379######################################################################
380#   Traitement special pour le nouveau rayonnement de Laurent Li.
381#   ---> YM desactive pour le traitemement en parallele
382######################################################################
383
384#if [[ -f $libf/phy$physique/raddim.h ]]
385#then
386# if [[ -f $libf/phy$physique/raddim.$dimh.h ]]
387#then
388#  \rm -f $libf/phy$physique/raddim.h
389#  cp -p $libf/phy$physique/raddim.$dimh.h $libf/phy$physique/raddim.h
390#  echo $libf/phy$physique/raddim.$dimh.h
391#  cat $libf/phy$physique/raddim.h
392# else
393#  echo On peut diminuer la taille de l executable en creant
394#  echo le fichier $libf/phy$physique/raddim.$dimh.h
395#  \cp -p $libf/phy$physique/raddim.defaut.h $libf/phy$physique/raddim.h
396# fi
397#fi
398
399######################################################################
400# Gestion du filtre qui n'existe qu'en 3d.
401######################################################################
402
403if (( `expr $dimc \> 2` == 1 ))
404then
405   filtre="FILTRE=$filtre"
406else
407   filtre="FILTRE= L_FILTRE= "
408fi
409echo MACRO FILTRE $filtre
410
411echo $dimc
412
413
414
415######################################################################
416# Creation du suffixe de la configuration
417######################################################################
418
419
420SUFF_NAME=_${dim_full}
421SUFF_NAME=${SUFF_NAME}_phy${physique}
422
423if [[ "$parallel" != "none" ]]
424then
425  SUFF_NAME=${SUFF_NAME}_para
426  DYN=dyn${dimc}d${paramem}
427  if [[ "$paramem" == "mem" ]]
428  then
429   SUFF_NAME=${SUFF_NAME}_${paramem}
430  fi
431else
432  SUFF_NAME=${SUFF_NAME}_seq
433  DYN=dyn${dimc}d
434fi
435
436if [[ $veget != "false" ]]
437then
438  SUFF_NAME=${SUFF_NAME}_orch
439fi
440
441if [[ $couple != "false" ]]
442then
443  SUFF_NAME=${SUFF_NAME}_couple
444fi
445
446if [[ $chimie == "INCA" ]]
447then
448  SUFF_NAME=${SUFF_NAME}_inca
449fi
450
451cd $LMDGCM
452config_fcm="config.fcm"
453rm -f $config_fcm
454touch $config_fcm
455rm -f bin/${code}${SUFF_NAME}.e
456rm -f arch.fcm
457rm -f arch.opt
458
459echo "%ARCH          $arch"          >> $config_fcm
460echo "%INCDIR        $INCLUDE"       >> $config_fcm 
461echo "%LIB           $LIB"           >> $config_fcm
462echo "%ROOT_PATH     $PWD"           >> $config_fcm
463echo "%LIBF          $LIBFGCM"       >> $config_fcm
464echo "%LIBO          $LIBOGCM"       >> $config_fcm
465echo "%DYN           $DYN"           >> $config_fcm
466echo "%PHYS          phy${physique}" >> $config_fcm
467echo "%COSP          $COSP_PATH"     >> $config_fcm
468echo "%CPP_KEY       $CPP_KEY"       >> $config_fcm
469echo "%EXEC          $code"          >> $config_fcm
470echo "%SUFF_NAME     $SUFF_NAME"     >> $config_fcm
471echo "%COMPIL_FFLAGS $COMPIL_FFLAGS" >> $config_fcm
472echo "%PARA_FFLAGS   $PARA_FFLAGS"   >> $config_fcm
473echo "%PARA_LD       $PARA_LD"       >> $config_fcm
474echo "%EXT_SRC       $EXT_SRC"       >> $config_fcm
475
476
477
478ln -s arch/arch-${arch}.fcm arch.fcm
479if test -f arch/arch-${arch}.opt &&  [ $compil_mod = "prod" ]
480  then
481  ln -s arch/arch-${arch}.opt arch.opt
482else
483  ln -s .void_file arch.opt
484fi
485
486
487rm -f $LIBOGCM/${arch}${SUFF_NAME}/.config/fcm.bld.lock
488./build_gcm ${fcm_path} -j $job $full
489
490rm -rf tmp_src
491rm -rf config
492ln -s $LIBOGCM/${arch}${SUFF_NAME}/.config config
493ln -s $LIBOGCM/${arch}${SUFF_NAME}/.config/tmp tmp_src
494
495#eventual cleanup for SISVAT
496sed -e 's/^src::sisvat/#src::sisvat/' bld.cfg > bld.tmp
497mv bld.tmp bld.cfg
498
499
500if [[ -r $LIBFGCM/grid/dimensions.h ]]
501then
502  # Cleanup: remove dimension.h file
503  \rm -f $LIBFGCM/grid/dimensions.h
504fi
Note: See TracBrowser for help on using the repository browser.