#!/bin/sh
# Copyright 2024 SPC-EPFL
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ----------------------------------------------------------------------

curdir=`pwd`
if [ $# -lt 2 ]
then
  chease_path=/home/codes/bin
else
  chease_path=$2
fi
echo $chease_path

export CHEASE_ROOT=$PWD  #this is the directory in which you have src-f90, WK, etc
if [ $# -ge 3 ]
then
  CHEASE_ROOT=$3
fi

export PATH=$CHEASE_ROOT/scripts_for_bin:$chease_path:$PATH # to add path for o.chease_to_cols and official chease release at SPC
which chease

fullpath=`realpath $0`
inputfiles=`dirname $fullpath`
echo "inputfiles = " $inputfiles
testdir='/tmp/'$USER'/nsttp_tests'
mkdir -p $testdir
#echo $testdir

cd $testdir

# 1-5 for nsttp=1-5 rhopsi
# 11-15 for same but rhotor
runtest=12
if [ $# -ge 1 ]
then
  runtest=$1
fi

if [ $runtest -eq 0 ]
then
 # run from eqdsk file nsttp=1 up to nsttp=5
 echo " "
 echo "************* from eqdsk with pprime, FFprime(rhopol)"
 cp $inputfiles/EQDSK_COCOS_11.OUT_EXPEQtest_1 EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo 'NEQDSK=1,' >> chease_namelist
 echo 'NSTTP=1,' >> chease_namelist
 echo 'NPROPT=-2,' >> chease_namelist
 echo '/' >> chease_namelist
 cp EXPEQ EXPEQ_orig
 cp chease_namelist chease_namelist_eqdsk
 cp chease_namelist o.EQDSK
 chease>>o.EQDSK
 cp -pr EQDSK_COCOS_11.OUT EQDSK_COCOS_11.OUT_fromEQDSK
 q0=0.802357108
 qedge=1.99278996
 betap=0.623757284
 grep --binary-files=text -E Q_ZERO\|Q_EDGE o.EQDSK | cut -c -25
 grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.EQDSK
 grep --binary-files=text SCALE o.EQDSK
 echo " "
 Q_ZERO=`grep --binary-files=text Q_ZERO o.EQDSK | cut -c -18`
 Q_EDGE=`grep --binary-files=text Q_EDGE o.EQDSK | cut -c -18`
 BETAPOL=`grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.EQDSK | cut -c -18`
 echo $q0
 echo $Q_ZERO
 err0=`perl -e "print ($q0-$Q_ZERO)"`
 erredge=`perl -e "print ($qedge-$Q_EDGE)"`
 errbetap=`perl -e "print ($betap-$BETAPOL)"`
 test_string0='x'$err0'x'
 test_stringedge='x'$erredge'x'
 test_stringbetap='x'$errbetap'x'
 if [ $test_string0 != 'xx' ] && [ $test_stringedge != 'xx' ] && [ $test_stringbetap != 'xx' ]
 then
     err_ok=`perl -e "print (abs($errbetap*$err0*$erredge)<1e-10)"`
 else
     echo "empty string in some err hence not defined"
     err_ok=0
 fi
 echo "err_ok = $err_ok, errq0 = $err0, errqedge = $erredge, errbetap = $errbetap"
 if [ $err_ok -eq '1' ]
 then
   CODE0=0
 else
   CODE0=1
   echo "exit with CODE0" $CODE0
   exit $CODE0
 fi

 echo " "
 echo "************* from EXPEQ.OUT.TOR with P, Istar(rhotornorm)"
 cp EXPEQ.OUT.TOR EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo 'NEQDSK=0,' >> chease_namelist
 echo 'NCSCAL=1,' >> chease_namelist
 echo 'QSPEC=' $q0 ',' >> chease_namelist
 echo 'NSTTP=2,' >> chease_namelist
 echo 'NPPFUN=8,' >> chease_namelist
 echo 'NPROPT=3,' >> chease_namelist
 echo 'NFUNRHO=1,' >> chease_namelist
 echo 'NRHOMESH=1,' >> chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.npropt_m2
 chease>>o.npropt_m2
 grep --binary-files=text -E Q_ZERO\|Q_EDGE o.npropt_m2 | cut -c -25
 grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.npropt_m2
 grep --binary-files=text SCALE o.npropt_m2
 echo " "
 Q_ZERO=`grep --binary-files=text Q_ZERO o.npropt_m2 | cut -c -18`
 Q_EDGE=`grep --binary-files=text Q_EDGE o.npropt_m2 | cut -c -18`
 BETAPOL=`grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.npropt_m2 | cut -c -18`
 err0=`perl -e "print ($q0-$Q_ZERO)"`
 erredge=`perl -e "print ($qedge-$Q_EDGE)"`
 errbetap=`perl -e "print ($betap-$BETAPOL)"`
 test_string0='x'$err0'x'
 test_stringedge='x'$erredge'x'
 test_stringbetap='x'$errbetap'x'
 if [ $test_string0 != 'xx' ] && [ $test_stringedge != 'xx' ] && [ $test_stringbetap != 'xx' ]
 then
     err_ok=`perl -e "print (abs($errbetap)*abs($erredge)<1e-5)"`
 else
     echo "empty string in some err hence not defined"
     err_ok=0
 fi
 echo "err_ok = $err_ok, errq0 = $err0, errqedge = $erredge, errbetap = $errbetap"
 if [ $err_ok -eq '1' ]
 then
   CODE1=0
 else
   CODE1=1
   echo "exit with CODE1" $CODE1
   exit $CODE1
 fi

 echo " "
 echo "************* from EXPEQ.OUT with pprime, Iparallel(rhopol)"
 restart=0
 if [ $restart -eq '1' ]
 then
   cp EXPEQ_orig EXPEQ
   cp chease_namelist_eqdsk chease_namelist
   echo 'NPROPT=3,' >> chease_namelist
   chease>>o.EQDSK_npropt_3
   ok_value=1e-6
 else
   ok_value=1e-4
 fi
 cp EXPEQ.OUT EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo 'NEQDSK=0,' >> chease_namelist
 echo 'NCSCAL=1,' >> chease_namelist
 echo 'QSPEC=' $q0 ',' >> chease_namelist
 echo 'NSTTP=3,' >> chease_namelist
 echo 'NPPFUN=4,' >> chease_namelist
 echo 'NPROPT=-4,' >> chease_namelist
 echo 'NFUNRHO=0,' >> chease_namelist
 echo 'NRHOMESH=0,' >> chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.npropt_3
 chease>>o.npropt_3
 grep --binary-files=text -E Q_ZERO\|Q_EDGE o.npropt_3 | cut -c -25
 grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.npropt_3
 grep --binary-files=text SCALE o.npropt_3
 echo " "
 Q_ZERO=`grep --binary-files=text Q_ZERO o.npropt_3 | cut -c -18`
 Q_EDGE=`grep --binary-files=text Q_EDGE o.npropt_3 | cut -c -18`
 BETAPOL=`grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.npropt_3 | cut -c -18`
 err0=`perl -e "print ($q0-$Q_ZERO)"`
 erredge=`perl -e "print ($qedge-$Q_EDGE)"`
 errbetap=`perl -e "print ($betap-$BETAPOL)"`
 test_string0='x'$err0'x'
 test_stringedge='x'$erredge'x'
 test_stringbetap='x'$errbetap'x'
 if [ $test_string0 != 'xx' ] && [ $test_stringedge != 'xx' ] && [ $test_stringbetap != 'xx' ]
 then
     err_ok=`perl -e "print (abs($errbetap)*abs($erredge)<$ok_value)"`
 else
     echo "empty string in some err hence not defined"
     err_ok=0
 fi
 echo "err_ok = $err_ok, errq0 = $err0, errqedge = $erredge, errbetap = $errbetap"
 if [ $err_ok -eq '1' ]
 then
   CODE2=0
 else
   CODE2=1
   echo "exit with CODE2" $CODE2
   exit $CODE2
 fi

 echo " "
 echo "************* from EXPEQ.OUT.TOR with P, <j.B>/B0(rhotornorm)"
 restart=1
 if [ $restart -eq '1' ]
 then
   cp EXPEQ_orig EXPEQ
   cp chease_namelist_eqdsk chease_namelist
   echo 'NPROPT=-4,' >> chease_namelist
   chease>>o.EQDSK_npropt_m4
   ok_value=3e-5
 else
   ok_value=1e-4
 fi
 cp EXPEQ.OUT.TOR EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo 'NEQDSK=0,' >> chease_namelist
 echo 'NCSCAL=1,' >> chease_namelist
 echo 'QSPEC=' $q0 ',' >> chease_namelist
 echo 'NSTTP=4,' >> chease_namelist
 echo 'NPPFUN=8,' >> chease_namelist
 echo 'NPROPT=-5,' >> chease_namelist
 echo 'NFUNRHO=1,' >> chease_namelist
 echo 'NRHOMESH=1,' >> chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.npropt_m4
 chease>>o.npropt_m4
 grep --binary-files=text -E Q_ZERO\|Q_EDGE o.npropt_m4 | cut -c -25
 grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.npropt_m4
 grep --binary-files=text SCALE o.npropt_m4
 echo " "
 Q_ZERO=`grep --binary-files=text Q_ZERO o.npropt_m4 | cut -c -18`
 Q_EDGE=`grep --binary-files=text Q_EDGE o.npropt_m4 | cut -c -18`
 BETAPOL=`grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.npropt_m4 | cut -c -18`
 err0=`perl -e "print ($q0-$Q_ZERO)"`
 erredge=`perl -e "print ($qedge-$Q_EDGE)"`
 errbetap=`perl -e "print ($betap-$BETAPOL)"`
 test_string0='x'$err0'x'
 test_stringedge='x'$erredge'x'
 test_stringbetap='x'$errbetap'x'
 if [ $test_string0 != 'xx' ] && [ $test_stringedge != 'xx' ] && [ $test_stringbetap != 'xx' ]
 then
     err_ok=`perl -e "print (abs($errbetap)*abs($erredge)<$ok_value)"`
 else
     echo "empty string in some err hence not defined"
     err_ok=0
 fi
 echo "err_ok = $err_ok, errq0 = $err0, errqedge = $erredge, errbetap = $errbetap"
 if [ $err_ok -eq '1' ]
 then
   CODE3=0
 else
   CODE3=1
   echo "exit with CODE3" $CODE3
   exit $CODE3
 fi

 echo " "
 echo "************* from EXPEQ.OUT.TOR with P, q(rhotornorm)"
 restart=1
 if [ $restart -eq '1' ]
 then
   cp EXPEQ_orig EXPEQ
   cp chease_namelist_eqdsk chease_namelist
   echo 'NPROPT=-5,' >> chease_namelist
   chease>>o.EQDSK_npropt_m4
   ok_value=3e-5
 else
   ok_value=1e-4
 fi
 cp EXPEQ.OUT.TOR EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo 'NEQDSK=0,' >> chease_namelist
 echo 'NCSCAL=1,' >> chease_namelist
 echo 'QSPEC=' $q0 ',' >> chease_namelist
 echo 'NSTTP=5,' >> chease_namelist
 echo 'NPPFUN=8,' >> chease_namelist
 echo 'NPROPT=5,' >> chease_namelist
 echo 'NFUNRHO=1,' >> chease_namelist
 echo 'NRHOMESH=1,' >> chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.npropt_m5
 chease>>o.npropt_m5
 grep --binary-files=text -E Q_ZERO\|Q_EDGE o.npropt_m5 | cut -c -25
 grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.npropt_m5
 grep --binary-files=text SCALE o.npropt_m5
 echo " "
 Q_ZERO=`grep --binary-files=text Q_ZERO o.npropt_m5 | cut -c -18`
 Q_EDGE=`grep --binary-files=text Q_EDGE o.npropt_m5 | cut -c -18`
 BETAPOL=`grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.npropt_m5 | cut -c -18`
 err0=`perl -e "print ($q0-$Q_ZERO)"`
 erredge=`perl -e "print ($qedge-$Q_EDGE)"`
 errbetap=`perl -e "print ($betap-$BETAPOL)"`
 test_string0='x'$err0'x'
 test_stringedge='x'$erredge'x'
 test_stringbetap='x'$errbetap'x'
 if [ $test_string0 != 'xx' ] && [ $test_stringedge != 'xx' ] && [ $test_stringbetap != 'xx' ]
 then
     err_ok=`perl -e "print (abs($errbetap)*abs($erredge)<$ok_value)"`
 else
     echo "empty string in some err hence not defined"
     err_ok=0
 fi
 echo "err_ok = $err_ok, errq0 = $err0, errqedge = $erredge, errbetap = $errbetap"
 if [ $err_ok -eq '1' ]
 then
   CODE4=0
 else
   CODE4=1
   echo "exit with CODE4" $CODE4
   exit $CODE4
 fi

 echo " "
 echo "************* from eqdsk with pressure and q(rhopol), ask for jedge=0"
 cp $inputfiles/EQDSK_COCOS_11.OUT_EXPEQtest_1 EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo 'NEQDSK=1,' >> chease_namelist
 echo 'NSTTP=5,' >> chease_namelist
 echo 'NPPFUN=8,' >> chease_namelist
 echo 'RELAX=0.2,' >> chease_namelist
 echo 'NINSCA=100,' >> chease_namelist
 echo 'NINMAP=100,' >> chease_namelist
 echo 'N0JEDGE=1,' >> chease_namelist
 echo 'NPROPT=-2,' >> chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.EQDSK_Q
 chease>>o.EQDSK_Q
 cp -pr EQDSK_COCOS_11.OUT EQDSK_COCOS_11.OUT_fromEQDSK_Q
 grep --binary-files=text -E Q_ZERO\|Q_EDGE o.EQDSK_Q | cut -c -25
 grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.EQDSK_Q
 grep --binary-files=text SCALE o.EQDSK_Q
 echo " "
 Q_ZERO=`grep --binary-files=text Q_ZERO o.EQDSK_Q | cut -c -18`
 Q_EDGE=`grep --binary-files=text Q_EDGE o.EQDSK_Q | cut -c -18`
 BETAPOL=`grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.EQDSK_Q | cut -c -18`
 err0=`perl -e "print ($q0-$Q_ZERO)"`
 erredge=`perl -e "print ($qedge-$Q_EDGE)"`
 errbetap=`perl -e "print ($betap-$BETAPOL)"`
 test_string0='x'$err0'x'
 test_stringedge='x'$erredge'x'
 test_stringbetap='x'$errbetap'x'
 if [ $test_string0 != 'xx' ] && [ $test_stringedge != 'xx' ] && [ $test_stringbetap != 'xx' ]
 then
     err_ok=`perl -e "print (abs($errbetap*$err0*$erredge)<1e-08)"`
 else
     echo "empty string in some err hence not defined"
     err_ok=0
 fi
 echo "err_ok = $err_ok, errq0 = $err0, errqedge = $erredge, errbetap = $errbetap"
 if [ $err_ok -eq '1' ]
 then
   CODE5=0
 else
   CODE5=1
   echo "exit with CODE5" $CODE5
   exit $CODE5
 fi

 echo " "
 echo "************* test NIN, from eqdsk with pressure and q(rhopol), ask for jedge=1"
 # Note can use NIN for nsttp5 only if NOUT was obtained with nsttp=5 option (specific arrays saved)
 cp NOUT NIN
 grep --binary-files=text -v / chease_namelist > tmp
 cp tmp chease_namelist
 echo 'N0JEDGE=0,' >> chease_namelist
 echo 'NOPT=-2,' >> chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.EQDSK_Q_b
 chease>>o.EQDSK_Q_b
 cp -pr EQDSK_COCOS_11.OUT EQDSK_COCOS_11.OUT_fromEQDSK_Q_b
 grep --binary-files=text -E Q_ZERO\|Q_EDGE o.EQDSK_Q_b | cut -c -25
 grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.EQDSK_Q_b
 grep --binary-files=text SCALE o.EQDSK_Q_b
 echo " "
 Q_ZERO=`grep --binary-files=text Q_ZERO o.EQDSK_Q_b | cut -c -18`
 Q_EDGE=`grep --binary-files=text Q_EDGE o.EQDSK_Q_b | cut -c -18`
 BETAPOL=`grep --binary-files=text -E "[0-9]+.*POLOIDAL BETA" o.EQDSK_Q_b | cut -c -18`
 err0=`perl -e "print ($q0-$Q_ZERO)"`
 erredge=`perl -e "print ($qedge-$Q_EDGE)"`
 errbetap=`perl -e "print ($betap-$BETAPOL)"`
 test_string0='x'$err0'x'
 test_stringedge='x'$erredge'x'
 test_stringbetap='x'$errbetap'x'
 if [ $test_string0 != 'xx' ] && [ $test_stringedge != 'xx' ] && [ $test_stringbetap != 'xx' ]
 then
     err_ok=`perl -e "print (abs($errbetap*$err0*$erredge)<1e-10)"`
 else
     echo "empty string in some err hence not defined"
     err_ok=0
 fi
 echo "err_ok = $err_ok, errq0 = $err0, errqedge = $erredge, errbetap = $errbetap"
 if [ $err_ok -eq '1' ]
 then
   CODE6=0
 else
   CODE6=1
   echo "exit with CODE6" $CODE6
   exit $CODE6
 fi

 CODEALL=`perl -e "print ($CODE0+$CODE1+$CODE2+$CODE3+$CODE4+$CODE5+$CODE6)"`
 echo "exit with CODEALL" $CODEALL
 exit $CODEALL

fi

if [ $runtest -eq 1 ]
then
 # run from eqdsk file
 cp $inputfiles/EQDSK_COCOS_11.OUT_EXPEQtest_1 EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo 'NEQDSK=1,' >> chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.EQDSK
 chease>>o.EQDSK
 cp -pr EQDSK_COCOS_11.OUT EQDSK_COCOS_11.OUT_fromEQDSK
fi

if [ $runtest -eq 2 ]
then
 # run from expeq with Istar file
 cp $inputfiles/EXPEQ.OUT_EXPEQtest_1_npropt2 EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.EXPEQ_nsttp2
 chease>>o.EXPEQ_nsttp2
 cp -pr EQDSK_COCOS_11.OUT EQDSK_COCOS_11.OUT_fromnsttp2
fi
if [ $runtest -eq 12 ]
then
 # run from eqdsk file
 cp $inputfiles/EXPEQ.OUT.TOR._EXPEQtest_1_npropt2 EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo 'NFUNRHO=1, NRHOMESH=1,' >> chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.EXPEQ.TOR_nsttp2
 chease>>o.EXPEQ.TOR_nsttp2
 cp -pr EQDSK_COCOS_11.OUT EQDSK_COCOS_11.OUT.TOR_fromnsttp2
fi

if [ $runtest -eq 3 ]
then
 # run from expeq with Iparallel file
 cp $inputfiles/EXPEQ.OUT_EXPEQtest_1_npropt3 EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.EXPEQ_nsttp3
 chease>>o.EXPEQ_nsttp3
 cp -pr EQDSK_COCOS_11.OUT EQDSK_COCOS_11.OUT_fromnsttp3
fi

if [ $runtest -eq 4 ]
then
 # run from expeq with Iparallel file
 cp $inputfiles/EXPEQ.OUT_EXPEQtest_1_npropt4 EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.EXPEQ_nsttp4
 chease>>o.EXPEQ_nsttp4
 cp -pr EQDSK_COCOS_11.OUT EQDSK_COCOS_11.OUT_fromnsttp4
fi

if [ $runtest -eq 5 ]
then
 # run from expeq with Iparallel file
 cp $inputfiles/EXPEQ.OUT_EXPEQtest_1_npropt5 EXPEQ
 cp $inputfiles/chease_namelist_top chease_namelist
 echo 'relax=0.6,' >> chease_namelist
 echo '/' >> chease_namelist
 cp chease_namelist o.EXPEQ_nsttp5
 /home/sauter/CHEASE/chease_develop/src-f90/chease>>o.EXPEQ_nsttp5
 o.chease_to_cols o.EXPEQ_nsttp5 o.EXPEQ_nsttp5.cols
 cp -pr EQDSK_COCOS_11.OUT EQDSK_COCOS_11.OUT_fromnsttp5
fi

cd $curdir
