---
stages:
  - prepareAll
  - preprocessing
  - postprocessing
  - compilePETSc
  - prepareGrid
  - grid
  - compileMarc
  - marc
  - example
  - performance
  - createPackage
  - createDocumentation
  - saveDocumentation
  - updateMaster
  - clean
  - releaseLock

###################################################################################################
before_script:
  - if [ $(awk "/$CI_PIPELINE_ID/{print NR}" $TESTROOT/GitLabCI.queue)x == 'x' ];
      then echo $CI_PIPELINE_ID >> $TESTROOT/GitLabCI.queue;
    fi
  - while [ $(awk "/$CI_PIPELINE_ID/{print NR}" $TESTROOT/GitLabCI.queue) != 1 ];
      do sleep 5m;
    done
  - source $DAMASKROOT/env/DAMASK.sh
  - cd $DAMASKROOT/PRIVATE/testing
  - echo Job start:" $(date)"

###################################################################################################
after_script:
  - echo Job end:" $(date)"

###################################################################################################
variables:
  # ===============================================================================================
  # GitLab Settings
  # ===============================================================================================
  GIT_SUBMODULE_STRATEGY: none

  # ===============================================================================================
  # Shortcut names
  # ===============================================================================================
  DAMASKROOT: "$TESTROOT/GitLabCI_Pipeline_$CI_PIPELINE_ID/DAMASK"

  # ===============================================================================================
  # Names of module files to load
  # ===============================================================================================
  # ++++++++++++ Compiler +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  IntelCompiler16_4:               "Compiler/Intel/16.4 Libraries/IMKL/2016"
  IntelCompiler17_8:               "Compiler/Intel/17.8 Libraries/IMKL/2017"
  IntelCompiler18_4:               "Compiler/Intel/18.4 Libraries/IMKL/2018"
  GNUCompiler8_2:                  "Compiler/GNU/8.2"
  # ------------ Defaults ----------------------------------------------
  IntelCompiler:                   "$IntelCompiler18_4"
  GNUCompiler:                     "$GNUCompiler8_2"
  # ++++++++++++ MPI ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  IMPI2018Intel18_4:               "MPI/Intel/18.4/IntelMPI/2018"
  MPICH3_3GNU8_2:                  "MPI/GNU/8.2/MPICH/3.3"
  # ------------ Defaults ----------------------------------------------
  MPICH_Intel:                     "$IMPI2018Intel18_4"
  MPICH_GNU:                       "$MPICH3_3GNU8_2"
  # ++++++++++++ PETSc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  PETSc3_10_3IMPI2018Intel18_4:    "Libraries/PETSc/3.10.3/Intel-18.4-IntelMPI-2018"
  PETSc3_10_3MPICH3_3GNU8_2:       "Libraries/PETSc/3.10.3/GNU-8.2-MPICH-3.3"
  # ------------ Defaults ----------------------------------------------
  PETSc_MPICH_Intel:               "$PETSc3_10_3IMPI2018Intel18_4"
  PETSc_MPICH_GNU:                 "$PETSc3_10_3MPICH3_3GNU8_2"
  # ++++++++++++ commercial FEM ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  Abaqus2019:                      "FEM/Abaqus/2019"
  MSC2018_1:                       "FEM/MSC/2018.1"
  # ------------ Defaults ----------------------------------------------
  Abaqus:                          "$Abaqus2019"
  MSC:                             "$MSC2018_1"
  IntelMarc:                       "$IntelCompiler17_8"
  IntelAbaqus:                     "$IntelCompiler16_4"
  HDF5Marc:                        "HDF5/1.10.4/Intel-17.8"
  # ++++++++++++ Documentation ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  Doxygen1_8_15:                   "Documentation/Doxygen/1.8.15"
  # ------------ Defaults ----------------------------------------------
  Doxygen:                         "$Doxygen1_8_15"


###################################################################################################
checkout:
  stage: prepareAll
  before_script:
    - echo $CI_PIPELINE_ID >> $TESTROOT/GitLabCI.queue
    - while [ $(awk "/$CI_PIPELINE_ID/{print NR}" $TESTROOT/GitLabCI.queue) != 1 ];
        do sleep 5m;
      done
  script:
    - mkdir -p $DAMASKROOT
    - cd $DAMASKROOT
    - if [ -d DAMASK ]; then rm -rf DAMASK; fi                                                      # there might be some leftovers from a failed clone
    - git clone -q git@magit1.mpie.de:damask/DAMASK.git .
    - git checkout $CI_COMMIT_SHA
    - git submodule update --init
    - source env/DAMASK.sh
    - make processing
  except:
    - master
    - release

###################################################################################################
OrientationRelationship:
  stage: preprocessing
  script: OrientationRelationship/test.py
  except:
    - master
    - release

Pre_SeedGeneration:
  stage: preprocessing
  script: PreProcessing_SeedGeneration/test.py
  except:
    - master
    - release

Pre_GeomGeneration:
  stage: preprocessing
  script: PreProcessing_GeomGeneration/test.py
  except:
    - master
    - release

Pre_GeomModification:
  stage: preprocessing
  script: PreProcessing_GeomModification/test.py
  except:
    - master
    - release

Pre_General:
  stage: preprocessing
  script: PreProcessing/test.py
  except:
    - master
    - release

grid_geometryPacking:
  stage: preprocessing
  script: grid_geometryPacking/test.py
  except:
    - master
    - release

###################################################################################################
Post_AverageDown:
  stage: postprocessing
  script: averageDown/test.py
  except:
    - master
    - release

Post_ASCIItable:
  stage: postprocessing
  script: ASCIItable/test.py
  except:
    - master
    - release

Post_General:
  stage: postprocessing
  script: PostProcessing/test.py
  except:
    - master
    - release

Post_GeometryReconstruction:
  stage: postprocessing
  script: spectral_geometryReconstruction/test.py
  except:
    - master
    - release

Post_addCurl:
  stage: postprocessing
  script: addCurl/test.py
  except:
    - master
    - release

Post_addDivergence:
  stage: postprocessing
  script: addDivergence/test.py
  except:
    - master
    - release

Post_addGradient:
  stage: postprocessing
  script: addGradient/test.py
  except:
    - master
    - release

Post_ParaviewRelated:
  stage: postprocessing
  script: ParaviewRelated/test.py
  except:
    - master
    - release

Post_OrientationConversion:
  stage: postprocessing
  script:
    - OrientationConversion/test.py
    - OrientationConversion/test2.py
  except:
    - master
    - release

Post_OrientationAverageMisorientation:
  stage: postprocessing
  script:
    - OrientationAverageMisorientation/test.py
  except:
    - master
    - release

###################################################################################################
grid_mech_compile_Intel:
  stage: compilePETSc
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel
    - cp -r grid_mech_compile grid_mech_compile_Intel
    - grid_mech_compile_Intel/test.py
  except:
    - master
    - release

Compile_FEM_Intel:
  stage: compilePETSc
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel
    - cp -r FEM_compile FEM_compile_Intel
    - FEM_compile_Intel/test.py
  except:
    - master
    - release

grid_mech_compile_GNU:
  stage: compilePETSc
  script:
    - module load $GNUCompiler $MPICH_GNU $PETSc_MPICH_GNU
    - cp -r grid_mech_compile grid_mech_compile_GNU
    - grid_mech_compile_GNU/test.py
  except:
    - master
    - release

Compile_FEM_GNU:
  stage: compilePETSc
  script:
    - module load $GNUCompiler $MPICH_GNU $PETSc_MPICH_GNU
    - cp -r FEM_compile FEM_compile_GNU
    - FEM_compile_GNU/test.py
  except:
    - master
    - release

###################################################################################################
Compile_Intel_Prepare:
  stage: prepareGrid
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel
    - cd $DAMASKROOT
    - make clean grid processing
  except:
    - master
    - release

###################################################################################################
Thermal:
  stage: grid
  script: Thermal/test.py
  except:
    - master
    - release

grid_packedGeometry:
  stage: grid
  script: grid_packedGeometry/test.py
  except:
    - master
    - release

grid_parsingArguments:
  stage: grid
  script: grid_parsingArguments/test.py
  except:
    - master
    - release

StateIntegration_compareVariants:
  stage: grid
  script: StateIntegration_compareVariants/test.py
  except:
    - master
    - release

nonlocal_densityConservation:
  stage: grid
  script: nonlocal_densityConservation/test.py
  except:
    - master
    - release

Spectral_ipNeighborhood:
  stage: grid
  script: Spectral_ipNeighborhood/test.py
  except:
    - master
    - release

RGC_DetectChanges:
  stage: grid
  script: RGC_DetectChanges/test.py
  except:
    - master
    - release

Nonlocal_Damage_DetectChanges:
  stage: grid
  script: Nonlocal_Damage_DetectChanges/test.py
  except:
    - master
    - release

grid_all_restart:
  stage: grid
  script: grid_all_restart/test.py
  except:
    - master
    - release

grid_parsingLoadCase:
  stage: grid
  script: grid_parsingLoadCase/test.py
  except:
    - master
    - release

grid_all_loadCaseRotation:
  stage: grid
  script: grid_all_loadCaseRotation/test.py
  except:
    - master
    - release

grid_mech_MPI:
  stage: grid
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel
    - grid_mech_MPI/test.py
  except:
    - master
    - release

grid_all_restartMPI:
  stage: grid
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel
    - grid_all_restartMPI/test.py
  except:
    - master
    - release

Plasticity_DetectChanges:
  stage: grid
  script: Plasticity_DetectChanges/test.py
  except:
    - master
    - release

Homogenization:
  stage: grid
  script: Homogenization/test.py
  except:
    - master
    - release

Phenopowerlaw_singleSlip:
  stage: grid
  script: Phenopowerlaw_singleSlip/test.py
  except:
    - master
    - release


###################################################################################################
Marc_compileIfort2018_1:
  stage: compileMarc
  script:
    - module load $IntelMarc $HDF5Marc $MSC
    - export DAMASK_HDF5=ON
    - Marc_compileIfort/test.py -m 2018.1
  except:
    - master
    - release


###################################################################################################
Hex_elastic:
  stage: marc
  script:
    - module load $IntelMarc $HDF5Marc $MSC
    - Hex_elastic/test.py
  except:
    - master
    - release

CubicFCC_elastic:
  stage: marc
  script:
    - module load $IntelMarc $HDF5Marc $MSC
    - CubicFCC_elastic/test.py
  except:
    - master
    - release

CubicBCC_elastic:
  stage: marc
  script:
    - module load $IntelMarc $HDF5Marc $MSC
    - CubicBCC_elastic/test.py
  except:
    - master
    - release

J2_plasticBehavior:
  stage: marc
  script:
    - module load $IntelMarc $HDF5Marc $MSC
    - J2_plasticBehavior/test.py
  except:
    - master
    - release


###################################################################################################
grid_all_example:
  stage: example
  script: grid_all_example/test.py

###################################################################################################
SpectralRuntime:
  stage: performance
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel
    - cd $DAMASKROOT
    - make clean grid processing OPTIMIZATION=AGGRESSIVE
    - cd $TESTROOT/performance                                                                      # location of old results
    - git checkout .                                                                                # undo any changes (i.e. run time data from non-development branch)
    - cd $DAMASKROOT/PRIVATE/testing
    - SpectralAll_runtime/test.py -d $TESTROOT/performance
  except:
    - master
    - release

###################################################################################################
createTar:
  stage: createPackage
  script:
    - cd $(mktemp -d)
    - $DAMASKROOT/PRIVATE/releasing/deployMe.sh $CI_COMMIT_SHA
  except:
    - master
    - release

###################################################################################################
AbaqusStd:
  stage: createDocumentation
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel $Doxygen
    - $DAMASKROOT/PRIVATE/documenting/runDoxygen.sh $DAMASKROOT abaqus
  except:
    - master
    - release

Marc:
  stage: createDocumentation
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel $Doxygen
    - $DAMASKROOT/PRIVATE/documenting/runDoxygen.sh $DAMASKROOT marc
  except:
    - master
    - release

GridSolver:
  stage: createDocumentation
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel $Doxygen
    - $DAMASKROOT/PRIVATE/documenting/runDoxygen.sh $DAMASKROOT spectral
  except:
    - master
    - release

Processing:
  stage: createDocumentation
  script:
    - cd $DAMASKROOT/processing/pre
    - rm abq_addUserOutput.py marc_addUserOutput.py
    - $DAMASKROOT/PRIVATE/documenting/scriptHelpToWiki.py --debug *.py
    - cd $DAMASKROOT/processing/post
    - rm vtk2ang.py DAD*.py
    - $DAMASKROOT/PRIVATE/documenting/scriptHelpToWiki.py --debug *.py
  except:
    - master
    - release

##################################################################################################
backupData:
  stage: saveDocumentation
  script:
    - cd $TESTROOT/performance                                                                      # location of new runtime results
    - git commit -am"${CI_PIPELINE_ID}_${CI_COMMIT_SHA}"
    - mkdir $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}
    - mv $TESTROOT/performance/time.png $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
    - mv $TESTROOT/performance/memory.png $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
    - mv $DAMASKROOT/PRIVATE/documenting/DAMASK_* $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
    - mv $DAMASKROOT/processing $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
  only:
    - development

##################################################################################################
mergeIntoMaster:
  stage: updateMaster
  script:
    - cd $DAMASKROOT
    - export TESTEDREV=$(git describe)                                                              # might be detached from development branch
    - echo $TESTEDREV > VERSION
    - git commit VERSION -m "[skip ci] updated version information after successful test of $TESTEDREV"
    - export UPDATEDREV=$(git describe)                                                             # tested state + 1 commit
    - git checkout master
    - git merge $UPDATEDREV -s recursive -X ours                                                    # conflicts occur only for inconsistent state
    - git push origin master                                                                        # master is now tested version and has updated VERSION file
    - git checkout development
    - git pull
    - git merge master -s recursive -X ours -m "[skip ci] Merge branch 'master' into development"   # only possible conflict is in VERSION file
    - git push origin development                                                                   # development is unchanged (as master is based on it) but has updated VERSION file
  only:
    - development

###################################################################################################
removeData:
  stage: clean
  before_script:
    - echo 'Do nothing'
  script:
    - rm -rf $TESTROOT/GitLabCI_Pipeline_$CI_PIPELINE_ID
    - sed -i "/$CI_PIPELINE_ID/d" $TESTROOT/GitLabCI.queue                                          # in case pipeline was manually (web GUI) restarted and releaseLock was performed already
  except:
    - master
    - release

###################################################################################################
removeLock:
  stage: releaseLock
  before_script:
    - echo 'Do nothing'
  when: always
  script: sed -i "/$CI_PIPELINE_ID/d" $TESTROOT/GitLabCI.queue
  except:
    - master
    - release