source: trunk/makelmdz @ 101

Last change on this file since 101 was 101, checked in by slebonnois, 14 years ago

SL: modifications pour arriver a compiler le gcm VENUS !
Ca marche !
A noter: modifs de makelmdz

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