From 44507563e15908287e0b23c2010a7d2facd0ac40 Mon Sep 17 00:00:00 2001
From: Remco Kok <rdkok@int3.local.snellius.surf.nl>
Date: Tue, 16 Nov 2021 15:15:26 +0100
Subject: [PATCH] Added snellius platform file and changed obs_gvp_co2 to
 read-only.

---
 da/observations/obs_gvp_co2.py |   2 +-
 da/platform/snellius.py        | 183 +++++++++++++++++++++++++++++++++
 2 files changed, 184 insertions(+), 1 deletion(-)
 create mode 100644 da/platform/snellius.py

diff --git a/da/observations/obs_gvp_co2.py b/da/observations/obs_gvp_co2.py
index 0701b728..6bb25dcf 100755
--- a/da/observations/obs_gvp_co2.py
+++ b/da/observations/obs_gvp_co2.py
@@ -95,7 +95,7 @@ class ObsPackObservations(Observations):
 
         # Step 1: Read list of available site files in package
         infile = os.path.join(self.obspack_dir, 'summary', '%s_dataset_summary.txt' % (self.obspack_id,))
-        f      = open(infile, 'r+', encoding="utf-8")
+        f      = open(infile, 'r', encoding="utf-8")
         lines  = f.readlines()
         f.close()
 
diff --git a/da/platform/snellius.py b/da/platform/snellius.py
new file mode 100644
index 00000000..4ef04249
--- /dev/null
+++ b/da/platform/snellius.py
@@ -0,0 +1,183 @@
+"""CarbonTracker Data Assimilation Shell (CTDAS) Copyright (C) 2017 Wouter Peters. 
+Users are recommended to contact the developers (wouter.peters@wur.nl) to receive
+updates of the code. See also: http://www.carbontracker.eu. 
+
+This program is free software: you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software Foundation, 
+version 3. This program is distributed in the hope that it will be useful, but 
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 
+
+You should have received a copy of the GNU General Public License along with this 
+program. If not, see <http://www.gnu.org/licenses/>."""
+#!/usr/bin/env python
+# cartesius.py
+
+"""
+Author : peters 
+
+Revision History:
+File created on 06 Sep 2010.
+
+"""
+
+import logging
+import subprocess
+
+from da.platform.platform_baseclass import Platform
+
+std_joboptions = {'jobname':'test', 'jobaccount':'co2', 'jobtype':'serial', 'jobshell':'/bin/sh', 'depends':'', 'jobtime':'24:00:00', 'jobinput':'/dev/null', 'jobnodes':'1', 'jobtasks':'', 'modulenetcdf':'netCDF/4.8.0-iimpi-2021a', 'networkMPI':'','jobqueue': 'thin'}
+
+
+class SnelliusPlatform(Platform):
+    def __init__(self):
+        self.ID = 'snellius'    # the identifier gives the platform name
+        self.version = '1.0'     # the platform version used
+
+
+    def give_blocking_flag(self):
+        """
+        Returns a blocking flag, which is important if tm5 is submitted in a queue system. The python ctdas code is forced to wait before tm5 run is finished
+
+        -on Huygens: return "-s"
+            -on Maunaloa: return "" (no queue available)
+            -on Jet/Zeus: return
+        """
+        return ""
+
+    def give_queue_type(self):
+        """
+        Return a queue type depending whether your computer system has a queue system, or whether you prefer to run in the foreground. 
+        On most large systems using the queue is mandatory if you run a large job.
+            -on Huygens: return "queue"
+            -on Maunaloa: return "foreground" (no queue available)
+            -on Jet/Zeus: return  
+
+        """
+        return "foreground"
+
+    def get_job_template(self, joboptions={}, block=False):
+        """ 
+        Returns the job template for a given computing system, and fill it with options from the dictionary provided as argument.
+        The job template should return the preamble of a job that can be submitted to a queue on your platform, 
+        examples of popular queuing systems are:
+            - SGE
+            - MOAB
+            - XGrid
+            -
+
+        A list of job options can be passed through a dictionary, which are then filled in on the proper line,
+        an example is for instance passing the dictionary {'account':'co2'} which will be placed 
+        after the ``-A`` flag in a ``qsub`` environment.
+
+        An extra option ``block`` has been added that allows the job template to be configured to block the current
+        job until the submitted job in this template has been completed fully.
+        """
+        
+        #template = """## \n"""+ \
+        #           """## This is a set of dummy names, to be replaced by values from the dictionary \n"""+ \
+        #           """## Please make your own platform specific template with your own keys and place it in a subfolder of the da package.\n """+ \
+        #           """## \n"""+ \
+        #           """ \n"""+ \
+        #           """#$ jobname \n"""+ \
+        #           """#$ jobaccount \n"""+ \
+        #           """#$ jobnodes \n"""+ \
+        #           """#$ jobtime \n"""+ \
+        #           """#$ jobshell \n"""+ \
+        #           """\n"""+ \
+        #           """source /usr/bin/sh\n"""+ \
+        #           """module load python\n"""+ \
+        #           """\n"""
+
+       
+        template = """#!/bin/bash \n""" + \
+                   """## \n""" + \
+                   """## This is a set of dummy names, to be replaced by values from the dictionary \n""" + \
+                   """## Please make your own platform specific template with your own keys and place it in a subfolder of the da package.\n """ + \
+                   """## \n""" + \
+                   """#SBATCH -J jobname \n""" + \
+                   """#SBATCH -p jobqueue \n""" + \
+                   """#SBATCH -n jobnodes \n""" + \
+                   """#SBATCH -t jobtime \n""" + \
+                   """#SBATCH -o joblog \n""" + \
+                   """module load ctdas2022 \n""" + \
+           """\n"""
+
+        if 'depends' in joboptions:
+            template += """#$ -hold_jid depends \n"""
+
+        # First replace from passed dictionary
+        for k, v in list(joboptions.items()):
+            while k in template:
+                template = template.replace(k, v)
+
+        # Fill remaining values with std_options
+        for k, v in list(std_joboptions.items()):
+            while k in template:
+                template = template.replace(k, v)
+
+        return template
+
+
+    def submit_job(self, jobfile, joblog=None, block=False):
+        """ This method submits a jobfile to the queue, and returns the queue ID """
+
+
+        #cmd     = ["llsubmit","-s",jobfile]
+        #msg = "A new task will be started (%s)"%cmd  ; logging.info(msg)
+
+        if block:
+            cmd = ["salloc",'-n',std_joboptions['jobnodes'],'-t',std_joboptions['jobtime'], jobfile]
+            logging.info("A new task will be started (%s)" % cmd)
+            output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
+            logging.info(output)
+            print(('output', output))
+            jobid = output.split()[-1]             
+            print(('jobid', jobid))
+        else:
+            cmd = ["sbatch", jobfile]
+            logging.info("A new job will be submitted (%s)" % cmd)
+            output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]  ; logging.info(output)
+            jobid = output.split()[-1]
+            
+        return jobid
+
+
+
+
+
+
+
+#        jobid   = output.split()[2]
+#        retcode = output.split()[-1]
+#   
+#         #for huygens
+#   print 'output', output
+#   test   = output.split()[3]
+#        dummy, jobid =test.split('nl.')
+#   jobid='%s%s' %('"',jobid)
+#   submitmsg ='%s%s%s'%(output.split()[4],output.split()[5],output.split()[6])
+#        if submitmsg=='hasbeensubmitted.':
+#       retcode=2
+#        print 'retcode',submitmsg,retcode   
+#        return retcode
+#
+#    def KillJob(self,jobid):
+#        """ This method kills a running job """
+#
+#        output = subprocess.Popen(['qdel',jobid], stdout=subprocess.PIPE).communicate()[0]  ; logging.info(output)
+#
+#        return output
+#
+#    def StatJob(self,jobid):
+#        """ This method gets the status of a running job """
+#        import subprocess
+#
+#        #output = subprocess.Popen(['sgestat'], stdout=subprocess.PIPE).communicate()[0]  ; logging.info(output)
+#
+#        return ''
+   
+
+
+if __name__ == "__main__":
+    pass
-- 
GitLab