Source code for hzdplugins.aiidaplugins.serverio

from aiida.orm import load_node

[docs]def qeCleanOneRemoteFolder(uuid, is_wfc=False, is_save=False): """ :code:`qeCleanOneRemoteFolderNoWfc` This method is used for clean the content on remote folder generated by Quantum Espresso. Since QE will generate a lot of files (e.g. 'mix', 'hub', 'wfc', 'restart', etc), so the storage on our supercomputer will be overloaded soon, that's not a good thing. :param uuid: the uuid value of certain node (CalcJob) :type uuid: python string object :param is_wfc: (optional, default = False) True if we want to delete all the wavefunction files :type is_wfc: python boolean object :param is_save: (optional, default = False )True if we want to delete all contents in :code:`aiida.save` folder :type is_save: python boolean object """ node = load_node(uuid=uuid) authinfo = node.get_authinfo() transport = authinfo.get_transport() remote_folder_path = node.get_remote_workdir() # get the path of remote folder, our working directory # open transport portal transport.open() # chdir to remote_folder_path transport.chdir(remote_folder_path) # now we are in working directory # The structure of each working directory is the same: # aiida.in aiida.out _aiidasubmit.sh out(folder) pseudo(folder) # determine whether out folder is in the path file_list = transport.listdir() if 'out' in file_list: transport.chdir(transport.getcwd() + '/out') # move to the out file # start deleting the files # *mix* *restart* *hub* *wfc* file_list = transport.listdir() for item in file_list: if 'hub' in item: transport.remove(transport.getcwd() + '/' + item) # delete the *hub* file elif 'mix' in item: transport.remove(transport.getcwd() + '/' + item) # delete the *mix* file elif 'restart' in item: transport.remove(transport.getcwd() + '/' + item) # delete the *restart* file if is_wfc: if 'wfc' in item: transport.remove(transport.getcwd() + '/' + item) # delete the *wfc* file # we still have a folder called aiida.save if is_save: if 'aiida.save' in file_list: transport.chdir(transport.getcwd() + '/aiida.save') # move to aiida.save folder file_list = transport.listdir() # we should delete wfc file and also charge-density file for item in file_list: if 'wfc' in item: transport.remove(transport.getcwd() + '/' + item) # delete the wavefunction file if 'charge' in item: transport.remove(transport.getcwd() + '/' + item) # delete the charge-density file if 'UPF' in item: transport.remove(transport.getcwd() + '/' + item) # delete the pseudopotential file print('uuid:{} -- All the unnecessary files have been deleted.'.format(uuid)) transport.close() else: print( 'uuid:{} --- There is no out folder in the working directory. Please check whether the calculation is ' 'sucessfully submitted and executed.') transport.close()
[docs]def qeCleanAllRemoteFolder(uuid_list, is_wfc, is_save): """ :code:`qeCleanAllRemoteFolderWithWfc` We would like to clean all the remote folder in the results. :param uuid_list: you can add a list of nodes that you want to clear the remote folder. e.g. [2020, 2030, 2040] etc. The function will only deal with the list object, other types of inputs are ignored. But if args is not set, then the function will deal with all the nodes in the results dictionary. :type uuid_list: python list object :param is_wfc: (optional, default = False) True if we want to delete all the wavefunction files :type is_wfc: python boolean object :param is_save: (optional, default = False )True if we want to delete all contents in :code:`aiida.save` folder :type is_save: python boolean object """ for uuid in uuid_list: qeCleanOneRemoteFolderWithWfc(uuid, is_wfc, is_save)
[docs]def qeRetriveAllFiles(uuid, localpath): """ :code:`qeRetriveAllFiles` can help us retrieve all the files from remote_folder_path :param uuid: The uuid of the computational node :type uuid: python string object :param localpath: The absolute path of local folder, which we want to store our information in. :type localpath: python string object :returns: There is no return. """ import os node = load_node(uuid=uuid) authinfo = node.get_authinfo() transport = authinfo.get_transport() remote_folder_path = node.get_remote_workdir() # get the path of remote folder, our working directory transport.open() transport.chdir(remote_folder_path) os.chdir(localpath) localpath_uuid = localpath + '/' + uuid os.system('mkdir ' + uuid) transport.gettree(remotepath=transport.getcwd(), localpath=localpath_uuid) pwd = transport.getcwd() transport.close() return 'The file from {} have been copied to {}'.format(pwd, localpath_uuid)
[docs]def setCmdOnRemoteComputer(cmd, uuid): """ :code:`setCmdOnRemoteComputer` can run command on remote computer from jupyterlab, which is really convenient, and also the command is programmable. :param cmd: represents the command that needs to be run on the remote server. :type cmd: python string object :param uuid: represents the uuid of the job. Our cmd will be operated in uuid work directory. :type uuid: python string object :returns: - **r** (`int`): if 0, means success - **stdout** (`list`): the return list of the cmd - **stderr** (`str`): the return message of error, if succeeds, then this is empty """ from hzdplugins.aiidaplugins.constants import cmd_shortcut # open the transport node = load_node(uuid=uuid) authinfo = node.get_authinfo() transport = authinfo.get_transport() remote_folder_path = node.get_remote_workdir() # get the path of remote folder, our working directory transport.open() transport.chdir(remote_folder_path) if cmd in cmd_shortcut.keys(): cmd = cmd_shortcut[cmd] r, stdout, stderr = transport.exec_command_wait(cmd) transport.close() return r, stdout, stderr