function up=pcaddsw(au) % PCADDSW % % additive Schwarz as a precondtioner on an m x m mesh % % function up=pcaddsw(au) % global ph pv overlap ac zm lc uc lf uf at global_levels [m1,m2]=size(au); m=sqrt(m1); au2=zeros(m,m); au2(:)=au; %ph=2; pv=2; overlap=max(3,floor(m/5)); % % % level=global_levels; up2=addswp(m,au2,overlap,ph,pv,ac,zm,level); up=up2(:); % % Divide the domain into ph * pv % subdomains, ph splits in horozontal and pv splits in vertical % function u2d=addswp(m,rhs2d,overlap,ph,pv,ac,zm,level) [l,r]=partition(m,2,overlap); [lv,rv]=partition(m,pv,overlap); [lh,rh]=partition(m,ph,overlap); h=1/(m+1); u2d=zeros(m,m); caph=1/pv; rc=zeros(ph,pv); % % Here's the one-level part. % mr=rv(1); lr=rv(1)-lv(1)+1; for ih=1:ph for iv=1:pv lbh=lh(ih); ubh=rh(ih); lbv=lv(iv); ubv=rv(iv); vd=ubv-lbv+1; hd=ubh-lbh+1; rsub=rhs2d(lbh:ubh,lbv:ubv); ux=subdomain(rsub,hd,vd,h); u2d(lbh:ubh,lbv:ubv)=u2d(lbh:ubh,lbv:ubv)+ux; end end if level == 2 u2d=u2d+cmsolv(m,ph/2,rhs2d); end