source: LMDZ6/trunk/makelmdz @ 3045

Last change on this file since 3045 was 3045, checked in by Ehouarn Millour, 7 years ago

Adapt makelmdz* and related scripts to read "ar" options from arch files.
EM

  • 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:executable set to *
File size: 23.8 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
27sisvat=false
28rrtm=false
29rrtm=false
30dust=false
31strataer=false
32full=""
33
34arch_defined="FALSE"
35arch_path="arch"
36arch_default_path="arch"
37
38# guess a default 'arch'
39arch="local" # start with assuming we're on a local machine with local arch file
40arch_defined="TRUE" # and thus also set arch_defined to true
41## try to recognise machine and infer arch from it
42machine=`hostname`
43if [[ "${machine:0:3}" == "ada" ]]
44then
45  arch="X64_ADA"
46fi
47if [[ "${machine:0:7}" == "platine" ]]
48then
49  arch="IA64_PLATINE"
50fi
51if [[ "${machine:0:6}" == "titane" ]]
52then
53  arch="X64_TITANE"
54fi
55if [[ "${machine:0:8}" == "mercure1" ]]
56then
57  arch="SX8_MERCURE"
58fi
59if [[ "${machine:0:8}" == "mercure2" ]]
60then
61  arch="SX9_MERCURE"
62fi
63
64LMDGCM=`pwd -P`
65LIBFGCM=$LMDGCM/libf
66LIBOGCM=$LMDGCM/libo
67if [[ ! -d $LIBOGCM ]]
68then
69  # create the directory
70  mkdir $LIBOGCM
71  if [[ ! $? ]]
72  then
73  echo "Failed to create directory $LIBOGCM"
74  exit
75  fi
76fi
77COSP_PATH=$LMDGCM/.void_dir
78
79
80
81localdir=`pwd -P`
82########################################################################
83#  Quelques initialisations de variables du shell.
84########################################################################
85
86CPP_KEY="" 
87INCLUDE='-I$(LIBF)/grid -I$(LIBF)/misc -I$(LIBF)/filtrez -I. '
88LIB=""
89adjnt=""
90##COMPIL_FFLAGS="%PROD_FFLAGS"
91PARA_FFLAGS=""
92PARA_LD=""
93EXT_SRC=""
94#src_dirs: directories containing source files
95src_dirs="grid misc" 
96########################################################################
97# lecture des options
98########################################################################
99
100while (($# > 0))
101  do
102  case $1 in
103      "-h") cat <<fin
104Usage :
105makelmdz [options] -arch nom_arch exec
106[-h]                       : brief help
107[-d [[IMx]JMx]LM]          : IM, JM, LM are the dimensions in x, y, z (default: $dim)
108[-p PHYS]                  : set of physical parametrizations (in libf/phyPHYS), (default: lmd)
109[-prod / -dev / -debug]    : compilation mode production (default) / developement / debug
110[-c false/MPI1/MPI2]       : coupling with ocean model : MPI1/MPI2/false (default: false)
111[-v false/orchidee2.0/orchidee1.9/true] : version of the vegetation model to include (default: false)
112          false       : no vegetation model
113          orchidee2.0 : compile using ORCHIDEE 2.0 (or more recent version)
114          orchidee1.9 : compile using ORCHIDEE up to the version including OpenMP in ORCHIDEE : tag 1.9-1.9.5(version AR5)-1.9.6
115          true        : (obsolete; for backward compatibility) use ORCHIDEE tag 1.9-1.9.6
116[-chimie INCA/false]       : with INCA chemistry model or without (default: false)
117[-cosp true/false]    : compile with/without cosp package (default: false)
118[-sisvat true/false]  : compile with/without sisvat package (default: false)
119[-rrtm true/false]    : compile with/without rrtm package (default: false)
120[-dust true/false]    : compile with/without the dust package from Boucher et al. (default: false)
121[-strataer true/false]    : compile with/without the strat aer package from Boucher et al. (default: false)
122[-parallel none/mpi/omp/mpi_omp] : parallelism (default: none) : mpi, openmp or mixted mpi_openmp
123[-g GRI]                   : grid configuration in dyn3d/GRI_xy.h  (default: reg, inclues a zoom)
124[-io ioipsl/mix/xios]                   : Input/Output library (default: ioipsl)
125[-include INCLUDES]        : extra include path to add
126[-cpp CPP_KEY]             : additional preprocessing definitions
127[-adjnt]                   : adjoint model, not operational ...
128[-mem]                     : reduced memory dynamics (if in parallel mode)
129[-filtre NOMFILTRE]        : use filtre from libf/NOMFILTRE (default: filtrez)
130[-full]                    : Full (re)compilation (from scratch)
131[-link LINKS]              : additional links with other libraries
132[-fcm_path path]           : path to the fcm tool (default: tools/fcm/bin)
133[-ext_src path]            : path to an additional set of routines to compile with the model
134[-arch_path path]          : path to architecture files (default: $arch_default_path)
135 -arch nom_arch            : target architecture
136 exec                      : executable to build
137fin
138          exit;;
139      "-d")
140          dim=$2 ; shift ; shift ;;
141     
142      "-p")
143          physique="$2" ;  shift ; shift ;;
144
145      "-g")
146          grille="$2" ; shift ; shift ;;
147
148      "-c")
149          couple="$2" ; shift ; shift ;;
150
151      "-prod")
152          compil_mod="prod" ; shift ;;
153
154      "-dev")
155          compil_mod="dev" ; shift ;;
156
157      "-debug")
158          compil_mod="debug" ; shift ;;
159
160      "-io")
161          io="$2" ; shift ; shift ;;
162
163      "-v")
164          veget="$2" ; shift ; shift ;;
165
166      "-chimie")
167          chimie="$2" ; shift ; shift ;;
168
169      "-parallel")
170          parallel="$2" ; shift ; shift ;;
171     
172      "-include")
173          INCLUDE="$INCLUDE -I$2" ; shift ; shift ;;
174
175      "-cpp")
176          CPP_KEY="$CPP_KEY $2" ; shift ; shift ;;
177
178      "-cosp")
179          cosp="$2" ; shift ; shift ;;
180     
181      "-sisvat")
182          sisvat="$2" ; shift ; shift ;;
183     
184      "-rrtm")
185          rrtm="$2" ; shift ; shift ;;
186
187      "-dust")
188          dust="$2" ; shift ; shift ;;
189     
190      "-strataer")
191          strataer="$2" ; shift ; shift ;;
192     
193      "-mem")
194          paramem="mem" ; shift ;;
195
196      "-filtre")
197          filtre=$2 ; shift ; shift ;;
198
199      "-full")
200      full="full" ; shift ;;
201
202      "-link")
203          LIB="$LIB $2" ; shift ; shift ;;
204
205      "-fcm_path")
206          fcm_path=$2 ; shift ; shift ;;
207
208      "-ext_src")
209          EXT_SRC=$2 ; src_dirs="$src_dirs $EXT_SRC" ; shift ; shift ;;
210
211      "-arch")
212          arch=$2 ; arch_defined="TRUE" ; shift ; shift ;;
213
214      "-arch_path")
215          arch_path=$2 ; arch_path_defined="TRUE"; shift ; shift ;;
216
217      *)
218          code="$1" ; shift ;;
219  esac
220done
221
222###############################################################
223# lecture des chemins propres \`a l'architecture de la machine #
224###############################################################
225rm -f .void_file
226echo > .void_file
227rm -rf .void_dir
228mkdir .void_dir
229
230if [[ "$arch_defined" == "TRUE" ]]
231then
232  rm -f arch.path
233  rm -f arch.fcm
234  rm -f arch.env
235
236  if test -f $arch_path/arch-${arch}.path
237  then
238    ln -s $arch_path/arch-${arch}.path arch.path
239  elif test -f $arch_default_path/arch-${arch}.path
240  then
241    ln -s $arch_default_path/arch-${arch}.path arch.path
242  fi
243       
244  if test -f $arch_path/arch-${arch}.fcm
245  then
246    ln -s $arch_path/arch-${arch}.fcm arch.fcm
247  elif test -f $arch_default_path/arch-${arch}.fcm
248  then
249    ln -s $arch_default_path/arch-${arch}.fcm arch.fcm
250  fi
251
252  if test -f $arch_path/arch-${arch}.env
253  then
254    ln -s $arch_path/arch-${arch}.env arch.env
255  elif test -f $arch_default_path/arch-${arch}.env
256  then
257    ln -s $arch_default_path/arch-${arch}.env arch.env
258  else
259    ln -s .void_file arch.env
260  fi
261  # source architecture PATH and ENV files
262  source arch.env
263  source arch.path
264else
265  echo "You must define a target architecture"
266  exit 1
267fi
268
269########################################################################
270# Definition des clefs CPP, des chemins des includes et modules
271#  et des libraries
272########################################################################
273
274# basic compile flags from arch.fcm file
275archfileline=$( grep -i '^%BASE_FFLAGS' arch.fcm )
276COMPIL_FFLAGS=$( echo ${archfileline##%BASE_FFLAGS} )
277
278# other compile flags, depending on compilation mode
279if [[ "$compil_mod" == "prod" ]]
280then
281## read COMPIL_FFLAGS from arch.fcm file
282  archfileline=$( grep -i '^%PROD_FFLAGS' arch.fcm )
283  archfileopt=$( echo ${archfileline##%PROD_FFLAGS} )
284  COMPIL_FFLAGS="${COMPIL_FFLAGS} ${archfileopt}"
285elif [[ "$compil_mod" == "dev" ]]
286then
287## read %DEV_FFLAGS from arch.fcm file
288  archfileline=$( grep -i '^%DEV_FFLAGS' arch.fcm )
289  archfileopt=$( echo ${archfileline##%DEV_FFLAGS} )
290  COMPIL_FFLAGS="${COMPIL_FFLAGS} ${archfileopt}"
291elif [[ "$compil_mod" == "debug" ]]
292then
293## read %DEBUG_FFLAGS from arch.fcm file
294  archfileline=$( grep -i '^%DEBUG_FFLAGS' arch.fcm )
295  archfileopt=$( echo ${archfileline##%DEBUG_FFLAGS} )
296  COMPIL_FFLAGS="${COMPIL_FFLAGS} ${archfileopt}"
297fi
298
299# add CPP_KEY defined in arch.fcm file
300archfileline=$( grep -i '^%FPP_DEF' arch.fcm )
301archfileopt=$( echo ${archfileline##%FPP_DEF} )
302CPP_KEY="$CPP_KEY ${archfileopt}"
303
304# get compiler name from arch.fcm file
305archfileline=$( grep -i '^%COMPILER' arch.fcm )
306fcompiler=$( echo ${archfileline##%COMPILER} )
307echo "MPI_BIN=$MPI_BIN"
308echo "fcompiler=$fcompiler"
309exit
310
311# get linker name from arch.fcm file
312archfileline=$( grep -i '^%LINK' arch.fcm )
313linker=$( echo ${archfileline##%LINK} )
314
315# get ar command from arch.fcm file
316archfileline=$( grep -i '^%AR ' arch.fcm )
317arcommand=$( echo ${archfileline##%AR} )
318
319# get ar command options from arch.fcm file
320archfileline=$( grep -i '^%ARFLAGS' arch.fcm )
321aroptions=$( echo ${archfileline##%ARFLAGS} )
322
323# get make utility from arch.fcm file
324archfileline=$( grep -i '^%MAKE' arch.fcm )
325makecommand=$( echo ${archfileline##%MAKE} )
326
327# get basic libraries to link with arch.fcm file
328archfileline=$( grep -i '^%BASE_LD' arch.fcm )
329archfileopt=$( echo ${archfileline##%BASE_LD} )
330LIB="$LIB  ${archfileopt}"
331
332# add Include files defined in arch.fcm file for pre-processing
333archfileline=$( grep -i '^%FPP_FLAGS' arch.fcm )
334for inc in $archfileline ; do INCLUDE="$INCLUDE `echo $inc | grep '\-I'`" ; done
335
336phys_root=$physique
337if [[ "${physique:0:3}" == "lmd" ]] ; then phys_root=lmd ; fi
338if [[ "${physique:0:4}" == "mars" ]] ; then phys_root=mars ; fi
339if [[ "${physique:0:3}" == "std" ]] ; then phys_root=std ; fi
340if [[ "${physique:0:5}" == "venus" ]] ; then phys_root=venus ; fi
341if [[ "${physique:0:5}" == "titan" ]] ; then phys_root=titan ; fi
342if [[ "${physique:0:3}" == "mar" ]] ; then phys_root=mar ; fi
343if [[ "${physique:0:3}" == "dev" ]] ; then phys_root=dev ; fi
344
345if [[ "$physique" != "nophys" ]]
346then
347   #We'll use some physics
348   src_dirs="$src_dirs phy_common phy$physique"
349   LIBPHY='$(LIBO)/libphy'"$physique"'.a'
350   LIBPHY_COMMON='$(LIBO)/libphy_common.a'
351   lib_phy='-lphy'"$physique"' -lphy_common'
352   CPP_KEY="$CPP_KEY CPP_PHYS"
353   if [[ $phys_root == "lmd" ]]
354      then
355      #For lmd physics, default planet type is Earth
356      CPP_KEY="$CPP_KEY CPP_EARTH"
357   fi
358fi
359
360if [[ "$chimie" == "INCA" ]]
361then
362   CPP_KEY="$CPP_KEY INCA"
363   INCLUDE="$INCLUDE -I${INCA_INCDIR}"
364   LIB="$LIB -L${INCA_LIBDIR} -lchimie"
365   libchimie=" -L${INCA_LIBDIR} -lchimie"
366fi
367
368if [[ "$couple" != "false" ]]
369then
370   CPP_KEY="$CPP_KEY CPP_COUPLE"
371   INCLUDE="$INCLUDE -I${OASIS_INCDIR}"
372   LIB="$LIB -L${OASIS_LIBDIR} -lpsmile.${couple} -lmpp_io"
373fi
374
375if [[ "$parallel" == "none" ]]
376then
377  FLAG_PARA=''
378else
379  FLAG_PARA="$paramem"
380  if [[ $paramem == par ]]
381  then
382      echo "The version of the dynamics in dyn3dpar is no longer updated."
383      echo "You should use option \"-mem\"."
384      exit 1
385  fi
386fi
387
388if [[ "$parallel" == "mpi" ]]
389then
390   CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI"
391  # MPI additional compilation options
392  archfileline=$( grep -i '^%MPI_FFLAGS' arch.fcm )
393  PARA_FFLAGS=$( echo ${archfileline##%MPI_FFLAGS} )
394  # MPI additional links
395  archfileline=$( grep -i '^%MPI_LD' arch.fcm )
396  PARA_LD=$( echo ${archfileline##%MPI_LD} )
397elif [[ "$parallel" == "omp" ]]
398then
399   CPP_KEY="$CPP_KEY CPP_PARA CPP_OMP"
400  # OMP additional compilation options
401  archfileline=$( grep -i '^%OMP_FFLAGS' arch.fcm )
402  PARA_FFLAGS=$( echo ${archfileline##%OMP_FFLAGS} )
403  # OMP additional links
404  archfileline=$( grep -i '^%OMP_LD' arch.fcm )
405  PARA_LD=$( echo ${archfileline##%OMP_LD} )
406elif [[ "$parallel" == "mpi_omp" ]]
407then
408   CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI CPP_OMP"
409  # MPI additional compilation options
410  archfileline=$( grep -i '^%MPI_FFLAGS' arch.fcm )
411  PARA_FFLAGS=$( echo ${archfileline##%MPI_FFLAGS} )
412  # OMP additional compilation options
413  archfileline=$( grep -i '^%OMP_FFLAGS' arch.fcm )
414  PARA_FFLAGS="${PARA_FFLAGS} "$( echo $archfileopt ${archfileline##%OMP_FFLAGS} )
415  # MPI additional links
416  archfileline=$( grep -i '^%MPI_LD' arch.fcm )
417  PARA_LD=$( echo ${archfileline##%MPI_LD} )
418  # OMP additional links
419  archfileline=$( grep -i '^%OMP_LD' arch.fcm )
420  PARA_LD="${PARA_LD} "$( echo $archfileopt ${archfileline##%OMP_LD} )
421fi
422
423if [[ ( "$parallel" == "omp" || "$parallel" == "mpi_omp" ) \
424   && "$compil_mod" == "debug" ]]
425then
426    echo "Usually, parallelization with OpenMP requires some optimization."
427    echo "We suggest switching to \"-dev\"."
428fi
429
430
431#==============================================================================
432if [ "$veget" = "true" -o "$veget" = "orchidee1.9" -o "$veget" = "orchidee2.0" ]
433then
434
435   INCLUDE="${INCLUDE} -I${ORCH_INCDIR}"
436   CPP_KEY="$CPP_KEY CPP_VEGET"
437# temporary, for Orchidee versions 1.9.* (before openmp activation)
438   if [[ "$veget" == "orchidee1.9" ]] ; then
439      CPP_KEY="$CPP_KEY ORCHIDEE_NOOPENMP"
440   fi
441   if [[ "$veget" == "orchidee2.0" ]] ; then
442      orch_libs="sechiba parameters stomate parallel orglob orchidee"
443   else
444      orch_libs="sechiba parameters stomate parallel orglob"
445   fi
446   LIB="${LIB} -L${ORCH_LIBDIR}"
447   for lib in ${orch_libs} ; do
448      if [ -f ${ORCH_LIBDIR}/lib${LIBPREFIX}$lib.a ] ; then
449         LIB="${LIB} -l${LIBPREFIX}$lib "
450      fi
451   done
452elif [[ "$veget" != "false" ]] ; then
453   echo "Option -v $veget does not exist"
454   echo "Use ./makelmdz -h for more information"
455   exit 
456fi
457
458#===============================================================================
459if [[ $io == ioipsl ]]
460then
461   CPP_KEY="$CPP_KEY CPP_IOIPSL"
462   INCLUDE="$INCLUDE -I${IOIPSL_INCDIR}"
463   LIB="$LIB -L${IOIPSL_LIBDIR} -l${LIBPREFIX}ioipsl"
464elif [[ $io == mix ]]
465then
466   # For now, xios implies also using ioipsl
467   CPP_KEY="$CPP_KEY CPP_IOIPSL CPP_XIOS"
468   INCLUDE="$INCLUDE -I${IOIPSL_INCDIR} -I${XIOS_INCDIR}"
469   LIB="$LIB -L${IOIPSL_LIBDIR} -l${LIBPREFIX}ioipsl -L${XIOS_LIBDIR} -l${LIBPREFIX}stdc++ -l${LIBPREFIX}xios"
470elif [[ $io == xios ]]
471then
472   # For now, xios implies also using ioipsl
473   CPP_KEY="$CPP_KEY CPP_IOIPSL CPP_XIOS CPP_IOIPSL_NO_OUTPUT"
474   INCLUDE="$INCLUDE -I${IOIPSL_INCDIR} -I${XIOS_INCDIR}"
475   LIB="$LIB -L${IOIPSL_LIBDIR} -l${LIBPREFIX}ioipsl -L${XIOS_LIBDIR} -l${LIBPREFIX}stdc++ -l${LIBPREFIX}xios"
476fi
477
478if [[ "$cosp" == "true" ]]
479then
480   CPP_KEY="$CPP_KEY CPP_COSP"
481   COSP_PATH="$LIBFGCM/phylmd/cosp"
482   src_dirs="$src_dirs cosp"
483#   LIB="${LIB} -l${LIBPREFIX}cosp"
484   opt_dep="$opt_dep cosp"
485   lcosp="-l${LIBPREFIX}cosp"
486   INCLUDE="$INCLUDE"' -I$(LIBF)/cosp'
487fi
488
489if [[ "$sisvat" == "true" ]]
490then
491   CPP_KEY="$CPP_KEY CPP_SISVAT"
492   src_dirs="$src_dirs phy${physique}/sisvat"
493fi
494
495if [[ "$rrtm" == "true" ]]
496then
497   CPP_KEY="$CPP_KEY CPP_RRTM"
498   src_dirs="$src_dirs phy${physique}/rrtm"
499fi
500
501if [[ "$dust" == "true" ]]
502then
503   CPP_KEY="$CPP_KEY CPP_Dust"
504   src_dirs="$src_dirs phy${physique}/Dust"
505fi
506
507if [[ "$strataer" == "true" ]]
508then
509   CPP_KEY="$CPP_KEY CPP_StratAer"
510   src_dirs="$src_dirs phy${physique}/StratAer"
511fi
512
513
514INCLUDE="$INCLUDE ${NETCDF_INCDIR}"
515LIB="$LIB ${NETCDF_LIBDIR}"
516
517########################################################################
518# calcul du nombre de dimensions
519########################################################################
520
521
522dim_full=$dim
523dim=`echo $dim | sed -e 's/[^0-9]/ /g'` 
524set $dim
525dimc=$#
526echo calcul de la dimension
527echo dim $dim
528echo dimc $dimc
529
530########################################################################
531# Gestion des dimensions du modele.
532# on cree ou remplace le fichier des dimensions
533########################################################################
534
535cd $LIBFGCM/grid
536if [[ -f dimensions.h ]]
537then
538  echo 'ATTENTION: vous etes sans doute en train de compiler le modele par ailleurs'
539  echo "Attendez que la premiere compilation soit terminee pour relancer la suivante."
540  echo "Si vous etes sur que vous ne compilez pas le modele par ailleurs,"
541  echo  vous pouvez continuer en repondant oui.
542  echo "Voulez-vous vraiment continuer?"
543  echo ""
544  echo "WARNING: you are probably already compiling the model somewhere else."
545  echo "Wait until the first compilation is finished before launching this one."
546  echo "If you are sure that you are not compiling elsewhere, just answer "
547  echo "yes (or 'oui') to the question below to proceed."
548  echo "Do you wish to continue?"
549  read reponse
550  if [[ $reponse == "oui" || $reponse == "yes" ]]
551  then
552    \rm -f $LIBFGCM/grid/dimensions.h
553  else
554    exit
555  fi
556fi
557
558cd $LIBFGCM/grid/dimension
559./makdim $dim
560if (($? != 0))
561then
562    exit 1
563fi
564
565cat $LIBFGCM/grid/dimensions.h
566cd $LMDGCM
567
568########################################################################
569# Differentes dynamiques (3d, 2d, 1d)
570########################################################################
571
572if (( $dimc == 3 )) ; then
573   src_dirs="$src_dirs $filtre dyn3d_common dyn3d${FLAG_PARA}"
574   if [[ $physique != "nophys" ]] ; then
575     src_dirs="$src_dirs dynphy_lonlat dynphy_lonlat/phy${phys_root}"
576     libdyn_phy="-ldynphy_lonlat"
577     LIBDYN_PHYS='$(LIBO)/libdynphy_lonlat.a'
578     INCLUDE="$INCLUDE "'-I$(LIBF)/dynphy_lonlat'
579     INCLUDE="$INCLUDE "'-I$(LIBF)/dynphy_lonlat/'"phy${phys_root}"
580   fi
581   cd $LIBFGCM/grid
582   \rm fxyprim.h
583   cp -p fxy_${grille}.h fxyprim.h
584   filtre="FILTRE=$filtre"
585   INCLUDE="$INCLUDE "'-I$(LIBF)/dyn3d${FLAG_PARA} -I$(LIBF)/dyn3d_common '
586elif (( $dimc == 2 )) ; then
587   src_dirs="$src_dirs dyn2d"
588   filtre="FILTRE= L_FILTRE= "
589   INCLUDE="$INCLUDE "'-I$(LIBF)/dyn2d'
590elif (( $dimc == 1 )) ; then
591   #src_dirs="$src_dirs dyn3d dyn3d_common filtrez"
592   src_dirs="$src_dirs phy${physique}/dyn1d"
593   CPP_KEY="$CPP_KEY CPP_1D"
594   filtre="L_DYN= DYN= FILTRE= L_FILTRE= "
595   #INCLUDE="$INCLUDE "'-I$(LIBF)/dyn3d -I$(LIBF)/dyn3d_common ' # Pas tres propre
596   INCLUDE="$INCLUDE "' -I$(LIBF)/phy'"$physique"'/dyn1d'
597else
598   echo Dimension dimc=$dimc pas prevu ; exit
599fi
600
601cd $LMDGCM
602
603########################################################################
604# library directory name:
605########################################################################
606
607nomlib=`echo ${arch}_${physique}_${dim_full}_${grille}_${compil_mod}_parall${parallel}_${CPP_KEY}_${FLAG_PARA} | sed -e 's/ //g' -e 's/-//g ' | sed -e 's/CPP_//g'`
608echo "Path to library: "$nomlib
609
610########################################################################
611#  Cleanup for a full recompilation, if requested
612########################################################################
613
614if [[ $full == "full" ]]
615then
616# remove makefile and librairies
617  echo "-full option: recompiling from scratch"
618  \rm -f makefile
619  \rm -rf "${LIBOGCM}/${nomlib}"
620fi
621
622########################################################################
623#  Avant de lancer le make, on recree le makefile si necessaire
624########################################################################
625########################################################################
626# c'est a dire dans 3 cas:
627# 1. si la liste des fichiers .F et .h a ete modifiee depuis la
628#    derniere creation du makefile
629# 2. si le fichier contenant cette liste "liste_des_sources"
630#    n'existe pas.
631# 3. Si le makefile n'existe pas.
632########################################################################
633cd $LMDGCM
634
635
636if [[ -r .makelmdz ]]
637then
638old_lmdz_configuration=$(cat .makelmdz )
639else
640old_lmdz_configuration=""
641fi
642lmdz_configuration="$src_dirs"
643if [[ "$lmdz_configuration" != "$old_lmdz_configuration" ]]
644then
645  configuration_change="true"
646else
647  configuration_change="false"
648fi
649
650mkdir -p make_dir
651suf_make=`echo $src_dirs | sed -e 's/\//_/g' -e 's/ /_/g'`
652echo suf_make $suf_make
653
654\rm tmp77 tmp90
655for dir in $src_dirs ; do
656find libf/$dir -name '*.[Fh]' -print | sort >> tmp77
657find libf/$dir -name '*.F90' -print | sort >> tmp90
658done
659
660liste77=make_dir/liste_des_sources_f77_$suf_make
661liste90=make_dir/liste_des_sources_f90_$suf_make
662makefile=make_dir/makefile_$suf_make
663
664if [[ $configuration_change == "true" || ! ( -r $makefile ) || ! ( -r $liste90 ) || ! ( -r $liste77 ) || ` diff tmp77 $liste77 | wc -w ` -ne 0 || ` diff tmp90 $liste90 | wc -w ` -ne 0 ]]
665then
666  echo "les fichiers suivants ont ete crees ou detruits"
667  echo "ou les fichiers suivants sont passes ou ne sont plus en Fortran 90"
668  diff $liste77 tmp77
669  diff $liste90 tmp90
670  \cp -f tmp77 $liste77
671  \cp -f tmp90 $liste90
672  echo "Recreating the makefile"
673  echo "src_dirs: $src_dirs"
674  ./create_make_gcm $src_dirs > tmp
675  \mv -f tmp $makefile
676  echo "New makefile created"
677fi
678
679ln -sf $makefile makefile
680
681#Create a .makelmdz file containing main compilation option for later comparisons
682echo "$lmdz_configuration" > .makelmdz
683
684#################################################################
685# Preparation de l'execution de la comande make
686#################################################################
687
688source_code=${code}.F
689dirmain=dyn${dimc}d${FLAG_PARA}
690if [[ -r $LMDGCM/libf/dyn${dimc}d${FLAG_PARA}/${code}.F90 ]]
691then
692  source_code=${code}.F90
693elif [[ -r $LMDGCM/libf/phy$physique/${code}.F90 ]] ; then
694  dirmain=phy$physique
695  source_code=${code}.F90
696elif [[ -r $LMDGCM/libf/dynphy_lonlat/phy$phys_root/${code}.F90 ]] ; then
697  dirmain="dynphy_lonlat/phy${phys_root}"
698  source_code=${code}.F90
699elif [[ -r $LMDGCM/libf/phy$physique/dyn1d/${code}.F90 ]] ; then
700  dirmain=phy$physique/dyn1d
701  source_code=${code}.F90
702fi
703
704if [[ ! -d "${LIBOGCM}/${nomlib}" ]]
705then
706  mkdir ${LIBOGCM}/${nomlib}
707  # check we indeed managed to create the directory
708  if [[ ! $? ]]
709  then
710    echo "Error: could not create directory ${LIBOGCM}/${nomlib}"
711    exit
712  fi
713fi
714
715# where module files are created
716mod_loc_dir=$localdir
717
718if [[ "$physique" != "nophys" ]]
719then
720  INCLUDE="$INCLUDE"' -I$(LIBF)/phy'"$physique"
721fi
722INCLUDE="$INCLUDE"' -I'${LIBOGCM}/${nomlib}
723
724# ranlib utility (check it exists or else default to ls)
725if [[ `which ranlib > /dev/null 2>&1 ; echo $?` -eq 0 ]]
726then
727  ranlib="ranlib"
728else
729  ranlib="ls"
730fi
731
732# add CPP keys to COMPIL_FLAGS
733# (but first add -D before all CPP_KEY items)
734cpp_definitions=`echo $CPP_KEY | sed -e 's/[A-Za-z_=0-9]*/-D&/g'`
735# (but add a -WF,-D before all CPP_KEY items) => for xlf on Vargas
736if [[ "${fcompiler:0:3}" == "xlf" ]]
737then
738cpp_definitions=`echo $CPP_KEY | sed -e 's/[A-Za-z_=0-9]*/-WF,-D&/g'`
739fi
740COMPIL_FFLAGS="${COMPIL_FFLAGS} ${cpp_definitions}"
741
742#################################################################
743# Execution du make
744#################################################################
745echo $makecommand RANLIB=$ranlib -f $LMDGCM/makefile \
746OPTION_DEP="$opt_dep" OPTION_LINK="$LIB ${PARA_LD}" \
747OPTIM90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
748OPTIMTRU90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
749OPTIM="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
750INCLUDE="$INCLUDE" \
751$filtre \
752LIBO=${LIBOGCM}/${nomlib} \
753"PHYS=$physique" \
754LIBPHY=${LIBPHY} \
755LIBPHY_COMMON=${LIBPHY_COMMON} \
756LIBDYN_PHYS=${LIBDYN_PHYS} \
757DIM=$dimc \
758FLAG_PARA=$FLAG_PARA \
759L_PHY="$lib_phy" \
760L_DYN_PHY="$libdyn_phy" \
761L_ADJNT=$adjnt \
762L_COSP="$lcosp" \
763L_CHIMIE="$libchimie" \
764LOCAL_DIR="$localdir"  \
765F77="$fcompiler" \
766F90="$fcompiler" \
767OPLINK="$LIB" \
768LINK="$linker" \
769GCM="$LMDGCM" \
770MOD_LOC_DIR=$mod_loc_dir \
771MOD_SUFFIX="mod" \
772AR=$arcommand \
773AROPT="$aroptions" \
774DIRMAIN=$dirmain \
775SOURCE=$source_code \
776PROG=$code
777
778$makecommand RANLIB=$ranlib -f $LMDGCM/makefile \
779OPTION_DEP="$opt_dep" OPTION_LINK="$LIB ${PARA_LD}" \
780OPTIM90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
781OPTIMTRU90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
782OPTIM="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \
783INCLUDE="$INCLUDE" \
784$filtre \
785LIBO=${LIBOGCM}/${nomlib} \
786"PHYS=$physique" \
787LIBPHY=${LIBPHY} \
788LIBPHY_COMMON=${LIBPHY_COMMON} \
789LIBDYN_PHYS=${LIBDYN_PHYS} \
790DIM=$dimc \
791FLAG_PARA=$FLAG_PARA \
792L_PHY="$lib_phy" \
793L_DYN_PHY="$libdyn_phy" \
794L_ADJNT=$adjnt \
795L_COSP="$lcosp" \
796L_CHIMIE="$libchimie" \
797LOCAL_DIR="$localdir"  \
798F77="$fcompiler" \
799F90="$fcompiler" \
800OPLINK="$LIB" \
801LINK="$linker" \
802GCM="$LMDGCM" \
803MOD_LOC_DIR=$mod_loc_dir \
804MOD_SUFFIX="mod" \
805AR=$arcommand \
806AROPT="$aroptions" \
807DIRMAIN=$dirmain \
808SOURCE=$source_code \
809PROG=$code
810
811
812if [[ -r $LIBFGCM/grid/dimensions.h ]]
813then
814  # Cleanup: remove dimension.h file
815  \rm -f $LIBFGCM/grid/dimensions.h
816fi
Note: See TracBrowser for help on using the repository browser.