docs: def write_lammps_inputs(output_dir, script_template, settings=None,
                          data=None, script_filename="in.lammps",
                          make_dir_if_not_present=True, **kwargs):
      """
      Writes input files for a LAMMPS run. Input script is constructed
      from a str template with placeholders to be filled by custom
      settings. Data file is either written from a LammpsData
      instance or copied from an existing file if read_data cmd is
      inspected in the input script. Other supporting files are not
      handled at the moment.
  
      Args:
          output_dir (str): Directory to output the input files.
          script_template (str): String template for input script with
              placeholders. The format for placeholders has to be
              '$variable_name', e.g., '$temperature'
          settings (dict): Contains values to be written to the
              placeholders, e.g., {'temperature': 1}. Default to None.
          data (LammpsData or str): Data file as a LammpsData instance or
              path to an existing data file. Default to None, i.e., no
              data file supplied. Useful only when read_data cmd is in
              the script.
          script_filename (str): Filename for the input script.
          make_dir_if_not_present (bool): Set to True if you want the
              directory (and the whole path) to be created if it is not
              present.
          **kwargs: kwargs supported by LammpsData.write_file.
  
      Examples:
          >>> eam_template = '''units           metal
          ... atom_style      atomic
          ...
          ... lattice         fcc 3.615
          ... region          box block 0 20 0 20 0 20
          ... create_box      1 box
          ... create_atoms    1 box
          ...
          ... pair_style      eam
          ... pair_coeff      1 1 Cu_u3.eam
          ...
          ... velocity        all create $temperature 376847 loop geom
          ...
          ... neighbor        1.0 bin
          ... neigh_modify    delay 5 every 1
          ...
          ... fix             1 all nvt temp $temperature $temperature 0.1
          ...
          ... timestep        0.005
          ...
          ... run             $nsteps'''
          >>> write_lammps_inputs('.', eam_template, settings={'temperature': 1600.0, 'nsteps': 100})
          >>> with open('in.lammps') as f:
          ...     script = f.read()
          ...
          >>> print(script)
          units           metal
          atom_style      atomic
  
          lattice         fcc 3.615
          region          box block 0 20 0 20 0 20
          create_box      1 box
          create_atoms    1 box
  
          pair_style      eam
          pair_coeff      1 1 Cu_u3.eam
  
          velocity        all create 1600.0 376847 loop geom
  
          neighbor        1.0 bin
          neigh_modify    delay 5 every 1
  
          fix             1 all nvt temp 1600.0 1600.0 0.1
  
          timestep        0.005
  
          run             100
  
  
      """
      variables = {} if settings is None else settings
      template = Template(script_template)
      input_script = template.safe_substitute(**variables)
      if make_dir_if_not_present and not os.path.exists(output_dir):
          os.makedirs(output_dir)
      with open(os.path.join(output_dir, script_filename), "w") as f:
          f.write(input_script)
      read_data = re.search(r"read_data\s+(.*)\n", input_script)
      if read_data:
          data_filename = read_data.group(1).split()[0]
          if isinstance(data, LammpsData):
              data.write_file(os.path.join(output_dir, data_filename), **kwargs)
          elif isinstance(data, str) and os.path.exists(data):
              shutil.copyfile(data, os.path.join(output_dir, data_filename))
          else:
              warnings.warn("No data file supplied. Skip writing %s."
                            % data_filename)