module patching {                   # Apply existing operator in all patches
  use patch
  use mkwallwt
contains
  subroutine patchingn( oper, modl, data, npatch, nwall, nwind, wind) {
    interface {
       integer function oper(adj, add, modl, data) {
          logical, intent (in) :: adj, add 
          real, dimension( :)  :: modl, data
          }
       }
    real,    dimension( :), intent( in)	 :: wind, modl
    real,    dimension( :), intent( out) :: data
    integer, dimension( :), pointer	 :: npatch, nwall, nwind
    real,    dimension( size( modl))	 :: wall
    real,    dimension( size( wind))     :: winmodl, windata
    integer				 :: i, stat1, stat2
    data = 0.
    call patch_init( npatch, nwall, nwind)
    do i = 1, product( npatch) {    
       stat1 = patch_lop( .false., .false., modl, winmodl)
       stat2 = oper(      .false., .false., winmodl, windata)
       stat1 = patch_lop( .true. , .true. , data,  wind * windata)
       call patch_close ()
       }
    call wallwtn( npatch, nwall, nwind, wind, wall);  data = data * wall
    }
}
