1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
function CreateGradBasisFunction3D(iscale,nmod)
%sbasis,frestart
load(fullfile('TMP','params'));
param0=param;
tic;
load(fullfile('TMP',sprintf('%d_params',nmod)),'param');
pscale=2^(iscale-1);
sbasis=param.basis;
if iscale>1
    sbasis='fem';
end
sizeim=ones(1,3);
switch sbasis
    case 'fem'

        mesh_file=fullfile('TMP',sprintf('%d_3d_mesh_%d',nmod,iscale-1));
        [dphidx,dphidy,dphidz]=CreateGradFiniteElementBasis3D(mesh_file,sizeim,pscale,[],'Gauss_points');
        wdetJ=GetWeigthDetJ(mesh_file,sizeim,1,'Gauss_points');

    case 'nurbs'
        mesh_file=fullfile('TMP',sprintf('%d_3d_mesh_%d',nmod,iscale-1));
        load(mesh_file,'degree');
            [dphidx,dphidy,dphidz,Xi,Yi,Zi,wdetJ]=CreateGradNURBSBasis3D(mesh_file,degree,'Gauss_points',1,'physical');

    otherwise
        error ('INVALID FUNCTIONAL BASIS');

end
        Nddl_tot=3*size(dphidx,2);
        phi0=sparse(size(dphidx,1),size(dphidx,2));
        epsxx=[dphidx,phi0,phi0];
        save(fullfile('TMP',sprintf('%d_3d_epsxx_%d',nmod,1*(iscale-1))),'epsxx','wdetJ','sizeim');
        epsyy=[phi0,dphidy,phi0];
        save(fullfile('TMP',sprintf('%d_3d_epsyy_%d',nmod,1*(iscale-1))),'epsyy','sizeim');
        epsxy=[dphidy,dphidx,phi0];
            Uxy=[dphidy,phi0,phi0];
            Uyx=[phi0,dphidx,phi0];
        save(fullfile('TMP',sprintf('%d_3d_epsxy_%d',nmod,1*(iscale-1))),'Uxy','Uyx','epsxy','sizeim');
        epsxz=[dphidz,phi0,dphidx];
        Uxz=[dphidz,phi0,phi0];
        Uzx=[phi0,phi0,dphidx];
        save(fullfile('TMP',sprintf('%d_3d_epsxz_%d',nmod,1*(iscale-1))),'Uxz','Uzx','epsxz','sizeim');
        epsyz=[phi0,dphidz,dphidy];
        Uyz=[phi0,dphidz,phi0];
        Uzy=[phi0,phi0,dphidy];
        save(fullfile('TMP',sprintf('%d_3d_epsyz_%d',nmod,1*(iscale-1))),'Uyz','Uzy','epsyz','sizeim');
        epszz=[phi0,phi0,dphidz];
        save(fullfile('TMP',sprintf('%d_3d_epszz_%d',nmod,1*(iscale-1))),'epszz','sizeim');

        if (iscale==1)&&(isfield(param,'enrichment'))

    mesh_file=fullfile('TMP',sprintf('%d_3d_mesh_%d',nmod,iscale-1));
    load(mesh_file,'ng','Nelems');
    wdetJo=GetWeigthDetJ(mesh_file,sizeim,1,'sub_cells',1);
    npt=size(wdetJo,1);
    epsxx=sparse(npt,size(epsxx,2));
    epsyy=sparse(npt,size(epsxx,2));
    epsxy=sparse(npt,size(epsxx,2));
    epsxz=sparse(npt,size(epsxx,2));
    epsyz=sparse(npt,size(epsxx,2));
    epszz=sparse(npt,size(epsxx,2));
    epscxx=sparse(npt,size(epsxx,2));
    epscyy=sparse(npt,size(epsxx,2));
    epscxy=sparse(npt,size(epsxx,2));
    epscxz=sparse(npt,size(epsxx,2));
    epscyz=sparse(npt,size(epsxx,2));
    epsczz=sparse(npt,size(epsxx,2));
        Uxy=sparse(npt,size(epsxx,2));
        Uyx=sparse(npt,size(epsxx,2));
        Uxz=sparse(npt,size(epsxx,2));
        Uzx=sparse(npt,size(epsxx,2));
        Uzy=sparse(npt,size(epsxx,2));
        Uyz=sparse(npt,size(epsxx,2));
        Ucxy=sparse(npt,size(epsxx,2));
        Ucyx=sparse(npt,size(epsxx,2));
        Ucxz=sparse(npt,size(epsxx,2));
        Uczx=sparse(npt,size(epsxx,2));
        Uczy=sparse(npt,size(epsxx,2));
        Ucyz=sparse(npt,size(epsxx,2));
    wdetJ=sparse(npt,1);
    if ~iscell(param.levelset_file)
        nbfis=1;
    else
        nbfis=numel(param.levelset_file);
    end
    roi=param0.roi;
    for ic=1:nbfis
        load(fullfile('TMP',sprintf('%d_enrichment_%d',nmod,ic)),'zone','face_nodes','face_elts','crackn','crackp');
        wdetJo=GetWeigthDetJ(mesh_file,sizeim,1,'sub_cells',face_elts);

        [dphidx,dphidy,dphidz]=CreateGradFiniteElementBasis3D(mesh_file,sizeim,pscale,face_nodes,'sub_cells',true,face_elts);
        phi0=sparse(size(dphidx,1),size(dphidx,2));
        epscxx=epscxx+[dphidx,phi0,phi0];
        epscyy=epscyy+[phi0,dphidy,phi0];
        epscxy=epscxy+[dphidy,dphidx,phi0];
        epscxz=epscxz+[dphidz,phi0,dphidx];
        epscyz=epscyz+[phi0,dphidz,dphidy];
        epsczz=epsczz+[phi0,phi0,dphidz];
        Ucxy=Ucxy+[dphidy,phi0,phi0];
        Ucyx=Ucyx+[phi0,dphidx,phi0];
        Ucxz=Ucxz+[dphidz,phi0,phi0];
        Uczx=Uczx+[phi0,phi0,dphidx];
        Uczy=Uczy+[phi0,phi0,dphidy];
        Ucyz=Ucyz+[phi0,dphidz,phi0];
        hn=double(crackn>=0);
        hn=diag(sparse(hn));
        heaviside=double(crackp>=0);
        heaviside=diag(sparse(heaviside));
        dphihdx=heaviside*dphidx(:,face_nodes)-dphidx(:,face_nodes)*hn;
        dphihdy=heaviside*dphidy(:,face_nodes)-dphidy(:,face_nodes)*hn;
        dphihdz=heaviside*dphidz(:,face_nodes)-dphidz(:,face_nodes)*hn;
        phih0=sparse(size(dphihdx,1),size(dphihdx,2));
        epsxx=[epsxx,dphihdx,phih0,phih0];
        epsyy=[epsyy,phih0,dphihdy,phih0];
        epsxy=[epsxy,dphihdy,dphihdx,phih0];
        epsxz=[epsxz,dphihdz,phih0,dphihdx];
        epsyz=[epsyz,phih0,dphihdz,dphihdy];
        epszz=[epszz,phih0,phih0,dphihdz];
        Uxy=[Uxy,dphihdy,phih0,phih0];
        Uyx=[Uyx,phih0,dphihdx,phih0];
        Uxz=[Uxz,dphihdz,phih0,phih0];
        Uzx=[Uzx,phih0,phih0,dphihdx];
        Uzy=[Uzy,phih0,phih0,dphihdy];
        Uyz=[Uyz,phih0,dphihdz,phih0];
        wdetJ=wdetJ+diag(wdetJo);
    end
        eps0=sparse(npt,size(epsxx,2)-size(epscxx,2));        
                   epscxx=[epscxx,eps0];
                    epscyy=[epscyy,eps0];
                   epscxy=[epscxy,eps0];
                   epscxz=[epscxz,eps0];
                   epscyz=[epscyz,eps0];
                   epsczz=[epsczz,eps0];
                   Ucxy=[Ucxy,eps0];
                   Ucxz=[Ucxz,eps0];
                   Uczy=[Uczy,eps0];
                   Ucyx=[Ucyx,eps0];
                   Uczx=[Uczx,eps0];
                   Ucyz=[Ucyz,eps0];
    wdetJ=diag(wdetJ);
    epsxx=epscxx+epsxx;
    epsyy=epscyy+epsyy;
    epsxy=epscxy+epsxy;
    epsxz=epscxz+epsxz;
    epsyz=epscyz+epsyz;
    epszz=epsczz+epszz;
    Uxy=Ucxy+Uxy;
    Uyx=Ucyx+Uyx;
    Uxz=Ucxz+Uxz;
    Uzx=Uczx+Uzx;
    Uzy=Uczy+Uzy;
    Uyz=Ucyz+Uyz;
    Nddl_tot=size(epsxx,2);
    save(fullfile('TMP',sprintf('%d_3d_xepsxx_%d',nmod,1*(iscale-1))),'epsxx','wdetJ','sizeim','Nddl_tot');
    save(fullfile('TMP',sprintf('%d_3d_xepsyy_%d',nmod,1*(iscale-1))),'epsyy','sizeim');
    save(fullfile('TMP',sprintf('%d_3d_xepsxy_%d',nmod,1*(iscale-1))),'epsxy','sizeim','Uxy','Uyx');
    save(fullfile('TMP',sprintf('%d_3d_xepsxz_%d',nmod,1*(iscale-1))),'epsxz','sizeim','Uxz','Uzx');
    save(fullfile('TMP',sprintf('%d_3d_xepsyz_%d',nmod,1*(iscale-1))),'epsyz','sizeim','Uzy','Uyz');
    save(fullfile('TMP',sprintf('%d_3d_xepszz_%d',nmod,1*(iscale-1))),'epszz','sizeim');
end
save(fullfile('TMP',sprintf('%d_3d_epsxx_%d',nmod,1*(iscale-1))),'Nddl_tot','-append');
disp(sprintf('Creating gradient basis function 3D for model %d...%6.2f s',nmod,toc));


end