File: BuildA.m

package info (click to toggle)
apbs 3.4.1-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 199,188 kB
  • sloc: ansic: 284,988; cpp: 60,416; fortran: 44,896; xml: 13,895; sh: 13,838; python: 8,105; yacc: 2,922; makefile: 1,428; f90: 989; objc: 448; lex: 294; awk: 266; sed: 205; java: 134; csh: 79
file content (126 lines) | stat: -rw-r--r-- 3,448 bytes parent folder | download | duplicates (7)
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
% memory allocation for arrays

fc=zeros(dime(1)-1,dime(2)-1,dime(3)-1);
AxB=zeros(dime(1)-1,dime(2)-1,dime(3)-1);
AyB=zeros(dime(1)-1,dime(2)-1,dime(3)-1);
AzB=zeros(dime(1)-1,dime(2)-1,dime(3)-1);
AAMain=zeros(prod(dime-2),1);
AAxB=zeros(prod(dime-2),1);
AAyB=zeros(prod(dime-2),1);
AAzB=zeros(prod(dime-2),1);
bb=zeros(prod(dime-2),1);

%step size

ch=prod(h)./(h.^2);

disp('constructing A Matrix....')

%boundary components are brought to the right-hand-side of the equation
for i=2:2
    for j=2:dime(2)-1
        for k=2:dime(3)-1
             fc(i,j,k)=fc(i,j,k)+dielx(i-1,j,k)*ch(1)*gxcf(j,k,1);
         end
    end
end
%boundary components are brought to the right-hand-side of the equation
for i=2:dime(1)-1
    for j=2:2
        for k=2:dime(3)-1
             fc(i,j,k)=fc(i,j,k)+diely(i,j-1,k)*ch(2)*gycf(i,k,1);  
         end
    end
end
%boundary components are brought to the right-hand-side of the equation
for i=2:dime(1)-1
    for j=2:dime(2)-1
        for k=2:2
             fc(i,j,k)=fc(i,j,k)+dielz(i,j,k-1)*ch(3)*gzcf(i,j,1); 
        end
    end
end 
%boundary components are brought to the right-hand-side of the equation
for i=dime(1)-1:dime(1)-1
    for j=2:dime(2)-1
        for k=2:dime(3)-1
             fc(i,j,k)=fc(i,j,k)+dielx(i,j,k)*ch(1)*gxcf(j,k,2);
        end
    end
end
%boundary components are brought to the right-hand-side of the equation
for i=2:dime(1)-1
            for j=dime(2)-1:dime(2)-1
                for k=2:dime(3)-1
             fc(i,j,k)=fc(i,j,k)+diely(i,j,k)*ch(2)*gycf(i,k,2);
                end
            end
end
%boundary components are brought to the right-hand-side of the equation
for i=2:dime(1)-1
    for j=2:dime(2)-1
        for k=dime(3)-1:dime(3)-1
            fc(i,j,k)=fc(i,j,k)+dielz(i,j,k)*ch(3)*gzcf(i,j,2); 
         end
    end
end 

zmagic=4*pi*e_c^2/(k_B*T)*10^8; % should be derived from unit conversions similar to zmagic in VPBE.c of APBS's source code


%first band, x-backward direction AxB
for i=2:dime(1)-1
    for j=1:dime(2)-1
        for k=1:dime(3)-1
             AxB(i-1,j,k)=-dielx(i-1,j,k)*ch(1);
        end
    end
end
%second band, y-backward direction AyB
for i=1:dime(1)-1
    for j=2:dime(2)-1
        for k=1:dime(3)-1
             AyB(i,j-1,k)=-diely(i,j-1,k)*ch(2);
        end
    end
end
%third band, z-backward direction AzB
for i=1:dime(1)-1
    for j=1:dime(2)-1
        for k=2:dime(3)-1
             AzB(i,j,k-1)=-dielz(i,j,k-1)*ch(3);
        end
    end
end

%array to column converter
for i=2:dime(1)-1
    for j=2:dime(2)-1
        for k=2:dime(3)-1
             pe=(k-2)*(dime(1)-2)*(dime(2)-2)+(j-2)*(dime(1)-2)+i-1;
             AAxB(pe)=AxB(i,j,k);
             AAyB(pe)=AyB(i,j,k);
             AAzB(pe)=AzB(i,j,k);
             AAMain(pe)=(dielx(i,j,k)+dielx(i-1,j,k))*ch(1)+(diely(i,j,k)+diely(i,j-1,k))*ch(2)...
          +(dielz(i,j,k)+dielz(i,j,k-1))*ch(3)+ prod(h)*kappa(i,j,k);
              bb(pe)=charge(i,j,k)*prod(ch)*zmagic+fc(i,j,k);
        end
    end
end

% Generating array by placing each diagonal column in the following order
diagonals=horzcat(AAMain,AAxB,AAyB,AAzB);

% Diagonal displacement vector corresponding to the pevious array
d=[0 -1 -(dime(1)-2) -(dime(1)-2)*(dime(2)-2)];

% Generating lower Sparse Matrix AA
AA=spdiags(diagonals, d, prod(dime-2), prod(dime-2));

% Generating the transpose Sparse Matrix AA
B=AA';

%Generating the symmetric A Matrix
A=tril(AA,0)+triu(B,1);

disp('Done!....')