void axmb(int m, int n, int ns1, int ns2, double *uu, double *ww, double *xg, double *yg,
int jsta2, int jend1){
int i,j;
double pi, hh, hh2;
hh = xg[1] - xg[0]; hh2 = hh*hh;
for(i=0;i<m*(ns2-ns1+1);i++) ww[i] = 0.L;
for(j=1;j<ns2-ns1;j++){
for(i=1;i<m-1;i++){
ww[i+m*j] += (-2.L*uu[i+m*j]+uu[i-1+m*j] + uu[i+1+m*j])/hh2;
}
}
hh = yg[1] - yg[0]; hh2 = hh*hh;
for(j=1;j<ns2-ns1;j++){
for(i=1;i<m-1;i++){
ww[i+m*j] += (-2.L*uu[i+m*j]+uu[i+m*(j-1)] + uu[i+m*(j+1)])/hh2;
}
}
pi = M_PI;
for(j=0;j<ns2-ns1+1;j++){
for(i=0;i<m;i++){
ww[i+m*j] -= (-2.l*pi*pi*cos(pi*xg[i])*cos(pi*yg[j+ns1-1]));
}
}
}
머리가 빠가라서
슬라이싱이 안되네
자살..
함수명이랑 변수명들이 극혐. 무슨 code obfuscator라도 돌림? ㅋㅋ
인자값 ㅈㄴ많넹
저런거하면 실력 안올ㄹㅏ.. 하지마 그냥
물리 천체 유체 하는형들은 변수명 다 이래..
ㅋㅋ m*j 만 봐도 어떻게 해야할지 보이지 않냐?
m*j m*(j - 1) m*(j + 1) 이 i 안에서 돌고 있는게 멍청멍청한거지
난 아직도 안보이는데..
연속성이 있는 청크로 잘리면 분배하겠는데 저거 되는건가
이거 뭐 아무생각도 없이 짰고만 ㅋㄷㅋㄷ
먼저 ns2 - ns1 부터 잘 정리해 이게 뭔꼴이야. ㅋㅋ
int h = ns2 - ns1 + 1; int w = m; 이겠네 height, width 의 개념으로 보면.
hh 는 변경없이 중복 대입이구, 결국 uu 의 변경없이 ww 에다 값 쓰기만하고 있는데 루프를 왜 세 덩어리나 구성함?
int sample_count = w * h; 로 하고
초기화 코드도 memset 이나
이건그냥 격자점의 대한 유한적분식 알려진거고 hh는 변경있잖아 uu는 가져오는 인덱스가 다르고 루프덩이가 3개인건 대입이 아니라 증감하고 있어서
2~10000 개정도 프로세스로 이걸 나누고 싶은데 최적화된 통신(메모리 분할)을 해주려니까 점점 미궁으로
아아 xg yg 군. 눈에 잘 안들어왔음.
다른사람 말을 반박할려니 갑자기 정리가 잘된다
for(i=0;i<m*(ns2-ns1+1);i++) ww[i] = 0.L; 이건 for(i = 0; i < sample_count; ++i) ww[i] = 0.;
n2가 적분 구간인가
double* w0 = ww + (j - 1) * w; double* w1 = ww + j * w; double* w2 = ww + (j + 1) * w로 j 루프 에 걸려 있어야하고
아니다. 위 아래 합치느라 착각했군. 첨엔 -1, +1 만 얻는거구나.
double* src = uu + j * w; double* dst = ww + j * w; 로 for j 에 넣은 다음
dst[i] = (-2. * src[i] + src[i - 1] + src[i + 1]) / hh2; 가 되는건데
이 말은 src[i], src[i - 1], src[i + 1] 의 값이 각각 유사한 값 T 라고 가정할때 -2T + T + T 즉, 0 에 수렴하는 값이 될테고,
전체적으론 0에 수렴하지만 상대 미분값의 좌우에 대한 경계강화 특성으로 ww 에 담기길 원한다는거지.
이걸 가로 세로에 대해 수행하는 것 같은데 웃긴건 xg 와 yg 의 범위 정의야.
즉 큰 for 문 둘을 하나로 합쳐도 무방한데, 그럴 경우, src 셋, tgt 하나 를 선언하면 되지.
double* src0 = uu + (j - 1) * w; double* src1 = uu + j * w; double* src2 = uu + (j + 1) * w; 로 위 아래 라인을 나타내게 하고 tgt 은 원래대로.
tgt[i] = (-2 * src1[i] + src1[i - 1] + src1[i + 1]) / hh1 + (-2 * src1[i] + src0[i] + src2[i]) / hh2; 의 식으로 위의 두 for 문들이 합쳐지는거지. 이 경우 초기화도 필요없음. 대입문이니.
여기다 마지막 for 문의 식을 빼주면 루프 하나로 합쳐짐.
어차피 제일 외곽의 값들은 앞의 두 덩어리 for 문에서 커널의 크기로 무시되고 있는 만큼 범위가 다른건 상관없다고 봄.
cos(pi*yg[j+ns1-1]) 는 y 방향 성분 즉 j 에 대해서 결정되는 값이고
(-2.l*pi*pi*cos(pi*xg[i]) 는 x 의 방향 성분 즉 i 에 대해서 결정되는 값이니 1차 루프에서 각각 yg xg 크기만큼 구해서 가져다 쓰기만 하면 됨.
요약하면 tgt[i] = ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - cos_xg[i] * cos_yg[j] 로 표현되고 끝난단 말슴. 뭐하러 cos 을 2 * n^2 회나 수행함?
dst, tgt 오락 가락하는건 이해해라 난 타이핑 편해서 tgt 를 좋아하는데 니들 위해서 dst 로 표현하려고 한거니까.
실제 현업에서 저따위로 코딩하는일 10년에 한번 있을까 말까다. 괜한 시간 낭비하지마라 ...
결장자 해외레어자료 브랜드신상 손흥민뉴스 스포츠네이버카페 *바이스포츠*