code: def loopuserdef(c1: Dict[str, Any]) -> xarray.DataArray:
      
  
      wmol = np.atleast_2d(c1['wmol'])
      P = np.atleast_1d(c1['p'])
      T = np.atleast_1d(c1['t'])
      time = np.atleast_1d(c1['time'])
  
      assert wmol.shape[0] == len(P) == len(T) == len(time), 'WMOL, P, T,time must be vectors of equal length'
  
      N = len(P)
  # %% 3-D array indexed by metadata
      TR = xarray.Dataset(coords={'time': time, 'wavelength_nm': None, 'angle_deg': None})
  
      for i in range(N):
          c = c1.copy()
          c['wmol'] = wmol[i, :]
          c['p'] = P[i]
          c['t'] = T[i]
          c['time'] = time[i]
  
          TR = TR.merge(golowtran(c))
  
      #   TR = TR.sort_index(axis=0) # put times in order, sometimes CSV is not monotonic in time.
  
      return TR
docs: golowtran() is for scalar parameters only
      (besides vector of wavelength, which Lowtran internally loops over)
  
      wmol, p, t must all be vector(s) of same length