source: LMDZ5/branches/LMDZ6_rc0/makelmdz_fcm @ 2897

Last change on this file since 2897 was 2160, checked in by Laurent Fairhead, 10 years ago

Merged trunk changes -r2070:2158 into testing branch. Compilation problems introduced by revision r2155 have been corrected by hand

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