abc プロジェクト
14.3.4. MakeControlCode メンバ関数説明 |
メンバ関数名 | MakeControlCode |
定義ファイル名 | pass5.cpp |
定義行 | 211 |
所属名 | TPass5 |
アクセス属性 | private |
宣言形式 | void MakeControlCode ( ) |
概要 | ABCLib/ABCLib_ControlRoutines.f を作成する。 |
戻り値 | |
パラメタ説明 | |
機能説明 | |
備考 | |
呼出し元関数一覧表
呼出し先関数一覧表
参照外部変数一覧表
参照メンバ変数一覧表
|
名称 |
定義ファイル名 |
定義行 |
1 |
TPass5::FittingF |
pass5.h |
44 |
2 |
TPass5::fpOutControl |
pass5.h |
42 |
3 |
TPass5::TuneRegionList |
pass5.h |
36 |
参照先一覧表
関数論理チャート
| +--------------------------------+
211 +--+ void TPass5::MakeControlCode() |
212 | { |
+--+-----------------------------+
213 +--- FILE *fp = fpOutControl;
214 +--- AnsiString s,s1,s2,s3;
215 +--- int i;
216 +--- TValData *ValData;
217 +--- int DefPosS,j;
218 +--- TToken *Token;
219 +--- TTuneRegion *TuneRegion;
220 +--- int TempLineNo;
221 +--- int len;
222 |
223 +--- //
224 | // ==== ABCLib_ATset(Type,Routines)
225 | //
226 |
227 +--- s = s1 = s2 = s3 = "";
| +------------------------------------------------+
228 +--+ for(i = 0 ; i < TuneRegionList->Count ; i++){ |
| +--+---------------------------------------------+
229 | +--- TuneRegion = (TTuneRegion *)TuneRegionList->Items[i];
| | +--------------+
230 | +--+ if(s != ""){ |
| | +--+-----------+
230 | | +--- s += ",";
| | +-+---+
230 | | | } |
| | +-----+
231 | +--- s += TuneRegion->Name;
| | +------------------------------------------+
232 | +--+ if(TuneRegion->TuneGroup == tgInstall){ |
| | +--+---------------------------------------+
| | | +----------------+
233 | | +--+ if(s1 != ""){ |
| | | +--+-------------+
233 | | | +--- s1 += ",";
| | | +-+---+
233 | | | | } |
| | | +-----+
234 | | +--- s1 += TuneRegion->Name;
| | +-+---+
235 | | | } |
| | +-+---+
| | +-+---------------------------------------------+
235 | | | else if(TuneRegion->TuneGroup == tgStatic){ |
| | +-+---------------------------------------------+
| | | +----------------+
236 | | +--+ if(s2 != ""){ |
| | | +--+-------------+
236 | | | +--- s2 += ",";
| | | +-+---+
236 | | | | } |
| | | +-----+
237 | | +--- s2 += TuneRegion->Name;
| | +-+---+
238 | | | } |
| | +-+---+
| | +-+---------------------------------------------+
238 | | | else if(TuneRegion->TuneGroup == tgDynamic){ |
| | +-+---------------------------------------------+
| | | +----------------+
239 | | +--+ if(s3 != ""){ |
| | | +--+-------------+
239 | | | +--- s3 += ",";
| | | +-+---+
239 | | | | } |
| | | +-----+
240 | | +--- s3 += TuneRegion->Name;
| | +-+---+
241 | | | } |
| | +-----+
| +-+---+
242 | | } |
| +-----+
243 |
244 +--- fprintf(fp,"c === ABCLib_ATset\n");
245 +--- fprintf(fp,"c ============================================================\n");
246 +--- fprintf(fp," subroutine ABCLib_ATset(ABCLib_TYPE, ABCLib_Routines)\n");
247 +--- fprintf(fp," integer ABCLib_TYPE\n");
248 +--- // fprintf(fp," character*10000 ABCLib_Routines\n");
249 +--- fprintf(fp," character*%d ABCLib_Routines\n",MainF->CharMaxLen);
250 +--- fprintf(fp,"\n");
251 +--- fprintf(fp," include 'ABCLibScript.h'\n");
252 +--- fprintf(fp,"\n");
253 +--- fprintf(fp,"c ==== All routines\n");
254 +--- fprintf(fp," if (ABCLib_TYPE .eq. 0) then\n");
255 +--- // 長い文字列は、分解して設定する。
| +--------------+
256 +--+ if(s == ""){ |
| +--+-----------+
257 | +--- fprintf(fp," ABCLib_Routines(1:%d) = '%s'\n",s.Length(),s.c_str());
| +-+---+
258 | | } |
| +-+---+
| +-+-------+
258 | | else{ |
| +-+-------+
| | +----------------------------------------+
259 | +--+ for(i = 1 ; i <= s.Length() ; i+= 35){ |
| | +--+-------------------------------------+
260 | | +--- len = s.Length() - i + 1;
| | | +----------------+
261 | | +--+ if(len > 35){ |
| | | +--+-------------+
262 | | | +--- len = 35;
| | | +-+---+
263 | | | | } |
| | | +-----+
264 | | +--- fprintf(fp," ABCLib_Routines(%d:%d) = '%s'\n",i,i+len-1,s.SubString(i,len).c_str());
| | +-+---+
265 | | | } |
| | +-----+
| +-+---+
266 | | } |
| +-----+
267 +--- fprintf(fp," endif\n");
268 +--- fprintf(fp,"\n");
269 +--- fprintf(fp,"c ==== Install Optimization\n");
270 +--- fprintf(fp," if (ABCLib_TYPE .eq. 1) then\n");
271 +--- // 長い文字列は、分解して設定する。
272 +--- s = s1;
| +--------------+
273 +--+ if(s == ""){ |
| +--+-----------+
274 | +--- fprintf(fp," ABCLib_Routines(1:%d) = '%s'\n",s1.Length(),s1.c_str());
| +-+---+
275 | | } |
| +-+---+
| +-+-------+
275 | | else{ |
| +-+-------+
| | +----------------------------------------+
276 | +--+ for(i = 1 ; i <= s.Length() ; i+= 35){ |
| | +--+-------------------------------------+
277 | | +--- len = s.Length() - i + 1;
| | | +----------------+
278 | | +--+ if(len > 35){ |
| | | +--+-------------+
279 | | | +--- len = 35;
| | | +-+---+
280 | | | | } |
| | | +-----+
281 | | +--- fprintf(fp," ABCLib_Routines(%d:%d) = '%s'\n",i,i+len-1,s.SubString(i,len).c_str());
| | +-+---+
282 | | | } |
| | +-----+
| +-+---+
283 | | } |
| +-----+
284 +--- fprintf(fp," endif\n");
285 +--- fprintf(fp,"\n");
286 +--- fprintf(fp,"c ==== Before Execution-invocation Optimization Routines\n");
287 +--- fprintf(fp," if (ABCLib_TYPE .eq. 2) then\n");
288 +--- // 長い文字列は、分解して設定する。
289 +--- s = s2;
| +--------------+
290 +--+ if(s == ""){ |
| +--+-----------+
291 | +--- fprintf(fp," ABCLib_Routines(1:%d) = '%s'\n",s2.Length(),s2.c_str());
| +-+---+
292 | | } |
| +-+---+
| +-+-------+
292 | | else{ |
| +-+-------+
| | +----------------------------------------+
293 | +--+ for(i = 1 ; i <= s.Length() ; i+= 35){ |
| | +--+-------------------------------------+
294 | | +--- len = s.Length() - i + 1;
| | | +----------------+
295 | | +--+ if(len > 35){ |
| | | +--+-------------+
296 | | | +--- len = 35;
| | | +-+---+
297 | | | | } |
| | | +-----+
298 | | +--- fprintf(fp," ABCLib_Routines(%d:%d) = '%s'\n",i,i+len-1,s.SubString(i,len).c_str());
| | +-+---+
299 | | | } |
| | +-----+
| +-+---+
300 | | } |
| +-----+
301 +--- fprintf(fp," endif\n");
302 +--- fprintf(fp,"\n");
303 +--- fprintf(fp,"c ==== Run-time Optimization Routines\n");
304 +--- fprintf(fp," if (ABCLib_TYPE .eq. 3) then\n");
305 |
306 +--- fprintf(fp," ABCLib_DYNAMICTUNE = .false.\n");
307 +--- // 長い文字列は、分解して設定する。
308 +--- s = s3;
| +--------------+
309 +--+ if(s == ""){ |
| +--+-----------+
310 | +--- fprintf(fp," ABCLib_Routines(1:%d) = '%s'\n",s3.Length(),s3.c_str());
| +-+---+
311 | | } |
| +-+---+
| +-+-------+
311 | | else{ |
| +-+-------+
| | +----------------------------------------+
312 | +--+ for(i = 1 ; i <= s.Length() ; i+= 35){ |
| | +--+-------------------------------------+
313 | | +--- len = s.Length() - i + 1;
| | | +----------------+
314 | | +--+ if(len > 35){ |
| | | +--+-------------+
315 | | | +--- len = 35;
| | | +-+---+
316 | | | | } |
| | | +-----+
317 | | +--- fprintf(fp," ABCLib_Routines(%d:%d) = '%s'\n",i,i+len-1,s.SubString(i,len).c_str());
| | +-+---+
318 | | | } |
| | +-----+
| +-+---+
319 | | } |
| +-----+
320 +--- fprintf(fp," endif\n");
321 +--- fprintf(fp,"\n");
322 +--- fprintf(fp," return\n");
323 +--- fprintf(fp," end\n");
324 +--- fprintf(fp,"c ============================================================\n");
325 +--- fprintf(fp,"\n");
326 +--- fprintf(fp,"\n");
327 |
328 +--- //
329 | // ABCLib_SetParam(Type,Routine,n,isw)
330 | // isw パラメータを所得する。 複数のTR(名前で識別)に対応する。
331 | //
332 |
333 +--- fprintf(fp,"c === ABCLib_SetParm\n");
334 +--- fprintf(fp,"c ============================================================\n");
335 +--- fprintf(fp," subroutine ABCLib_SetParm(ABCLib_TYPE, ABCLib_Routine, n, isw)\n");
336 +--- fprintf(fp," integer ABCLib_TYPE\n");
337 +--- // fprintf(fp," character*10000 ABCLib_Routine\n");
338 +--- fprintf(fp," character*%d ABCLib_Routine\n",MainF->CharMaxLen);
339 +--- fprintf(fp," integer n,isw\n");
340 +--- fprintf(fp,"\n");
341 +--- fprintf(fp," include 'ABCLibScript.h'\n");
342 +--- fprintf(fp,"\n");
343 |
| +----------------------------------+
344 +--+ if(FittingF){ // Fitting用配列 |
| +--+-------------------------------+
345 | +--- fprintf(fp,"c !!!!!! fitting用配列\n");
346 | +--- fprintf(fp,"c === for target coefficients\n");
347 | +--- fprintf(fp," real*8 a_lsm(0:ABCLibLSM_MAX_M, 0:ABCLibLSM_MAX_NPARM-1)\n");
348 | +--- fprintf(fp," real*8 dtemp\n");
349 | +--- fprintf(fp,"\n");
350 | +--- fprintf(fp," integer nparm, nsamp\n");
| +-+---+
351 | | } |
| +-----+
352 +--- fprintf(fp,"\n");
353 +--- fprintf(fp," integer ibsw\n");
354 +--- fprintf(fp,"\n");
355 +--- fprintf(fp," character*100 cbuf\n");
356 +--- fprintf(fp," character*20 digit\n");
357 +--- fprintf(fp,"\n");
358 |
359 +--- TempLineNo = 100;
360 +--- fprintf(fp,"c ==== Install Optimization\n");
361 +--- fprintf(fp," if (ABCLib_TYPE .eq. 1) then\n");
362 |
| +------------------------------------------------+
363 +--+ for(i = 0 ; i < TuneRegionList->Count ; i++){ |
| +--+---------------------------------------------+
364 | +--- TuneRegion = (TTuneRegion *)TuneRegionList->Items[i];
| | +------------------------------------------+
365 | +--+ if(TuneRegion->TuneGroup == tgInstall){ |
| | +--+---------------------------------------+
366 | | +--- TuneRegion->OutputSetParamCode(fp,TempLineNo);
367 | | +--- TempLineNo += 10;
| | +-+---+
368 | | | } |
| | +-----+
| +-+---+
369 | | } |
| +-----+
370 +--- fprintf(fp," endif\n");
371 +--- fprintf(fp,"c === end of ABCLib_Install\n");
372 +--- fprintf(fp,"c -----------------------------------------------\n");
373 |
374 +--- fprintf(fp,"\n");
375 +--- fprintf(fp,"c ==== Before Execution-invocation Optimization\n");
376 +--- fprintf(fp," if (ABCLib_TYPE .eq. 2) then\n");
| +------------------------------------------------+
377 +--+ for(i = 0 ; i < TuneRegionList->Count ; i++){ |
| +--+---------------------------------------------+
378 | +--- TuneRegion = (TTuneRegion *)TuneRegionList->Items[i];
| | +----------------------------------------+
379 | +--+ if(TuneRegion->TuneGroup == tgStatic){ |
| | +--+-------------------------------------+
380 | | +--- TuneRegion->OutputSetParamCode(fp,TempLineNo);
381 | | +--- TempLineNo += 10;
| | +-+---+
382 | | | } |
| | +-----+
| +-+---+
383 | | } |
| +-----+
384 +--- fprintf(fp," endif\n");
385 +--- fprintf(fp,"c === end of ABCLib_Static\n");
386 +--- fprintf(fp,"c -----------------------------------------------\n");
387 |
388 +--- fprintf(fp,"\n");
389 +--- fprintf(fp,"c ==== Run-time Optimization\n");
390 +--- fprintf(fp," if (ABCLib_TYPE .eq. 3) then\n");
391 +--- //
392 | // g95コンパイラでのエラー回避(Operands of comparision oprator are Logical(4)/Logical(4)
393 | // 論理値どうしの比較を行っているエラー回避のため、論理値をifで直接使用に修正した。
394 | // 2007/1/18
395 | //
396 | // fprintf(fp," if (ABCLib_DYNAMICTUNE .eq. .true.) then\n");
397 +--- fprintf(fp," if (ABCLib_DYNAMICTUNE) then\n");
| +------------------------------------------------+
398 +--+ for(i = 0 ; i < TuneRegionList->Count ; i++){ |
| +--+---------------------------------------------+
399 | +--- TuneRegion = (TTuneRegion *)TuneRegionList->Items[i];
| | +------------------------------------------+
400 | +--+ if(TuneRegion->TuneGroup == tgDynamic){ |
| | +--+---------------------------------------+
401 | | +--- // Dynamicは、SetParamで、ファイルから読込みしない。
402 | | +--- fprintf(fp," call ABCLib_ATexecDynamic%s(ABCLib_Routines,n,isw)\n",TuneRegion->Name);
| | +-+---+
403 | | | } |
| | +-----+
| +-+---+
404 | | } |
| +-----+
405 +--- fprintf(fp," else\n");
406 +--- fprintf(fp," isw = 1\n");
407 +--- fprintf(fp," endif\n");
408 +--- fprintf(fp," endif\n");
409 +--- fprintf(fp,"c === end of ABCLib_Dynamic\n");
410 +--- fprintf(fp,"c -----------------------------------------------\n");
411 +--- fprintf(fp,"\n");
412 +--- fprintf(fp," return\n");
413 +--- fprintf(fp," end\n");
414 +--- fprintf(fp,"\n");
415 +--- fprintf(fp,"\n");
416 |
417 +--- //
418 | // 文字列操作のサブルーチン
419 | //
420 +--- fprintf(fp," subroutine ABCLibCharToNum(coption, inum)\n");
421 +--- fprintf(fp," character*20 coption\n");
422 +--- fprintf(fp," integer inum\n");
423 +--- fprintf(fp,"\n");
424 +--- fprintf(fp," integer j\n");
425 +--- fprintf(fp," integer idec\n");
426 +--- fprintf(fp," character ctemp\n");
427 +--- fprintf(fp,"\n");
428 +--- fprintf(fp," inum = 0\n");
429 +--- fprintf(fp," j = 1\n");
430 +--- fprintf(fp," do while(coption(j:j) .ne. ' ')\n");
431 +--- fprintf(fp," ctemp = coption(j:j)\n");
432 +--- fprintf(fp," if (ctemp .eq. ' ') goto 100\n");
433 +--- fprintf(fp," if (ctemp .eq. '0') idec = 0\n");
434 +--- fprintf(fp," if (ctemp .eq. '1') idec = 1\n");
435 +--- fprintf(fp," if (ctemp .eq. '2') idec = 2\n");
436 +--- fprintf(fp," if (ctemp .eq. '3') idec = 3\n");
437 +--- fprintf(fp," if (ctemp .eq. '4') idec = 4\n");
438 +--- fprintf(fp," if (ctemp .eq. '5') idec = 5\n");
439 +--- fprintf(fp," if (ctemp .eq. '6') idec = 6\n");
440 +--- fprintf(fp," if (ctemp .eq. '7') idec = 7\n");
441 +--- fprintf(fp," if (ctemp .eq. '8') idec = 8\n");
442 +--- fprintf(fp," if (ctemp .eq. '9') idec = 9\n");
443 +--- fprintf(fp," inum = inum*10 + idec\n");
444 +--- fprintf(fp," j = j + 1\n");
445 +--- fprintf(fp," enddo\n");
446 +--- fprintf(fp," 100 continue\n");
447 +--- fprintf(fp,"\n");
448 +--- fprintf(fp," return\n");
449 +--- fprintf(fp," end\n");
450 +--- fprintf(fp,"\n");
451 +--- fprintf(fp,"c ============================================================\n");
452 +--- fprintf(fp,"\n");
453 +--- fprintf(fp,"\n");
454 |
455 |
456 +--- //
457 | // ABCLib_ATexec(Type,Routines)
458 | //
459 | //
460 +--- fprintf(fp,"c === ABCLib_ATexec\n");
461 +--- fprintf(fp,"c ============================================================\n");
462 +--- fprintf(fp," subroutine ABCLib_ATexec(ABCLib_TYPE, ABCLib_Routines)\n");
463 +--- fprintf(fp," integer ABCLib_TYPE\n");
464 +--- // fprintf(fp," character*10000 ABCLib_Routines\n");
465 +--- fprintf(fp," character*%d ABCLib_Routines\n",MainF->CharMaxLen);
466 +--- fprintf(fp,"\n");
467 +--- fprintf(fp," include 'ABCLibScript.h'\n");
468 +--- fprintf(fp,"\n");
469 +--- fprintf(fp,"c ==== Install Optimization\n");
470 +--- fprintf(fp," if (ABCLib_TYPE .eq. 1) then\n");
471 +--- // fprintf(fp," call ABCLib_ATexecInstall(ABCLib_Routines)\n");
472 | // for(i = TuneRegionList->Count-1 ; i >= 0 ; i--){
| +------------------------------------------------+
473 +--+ for(i = 0 ; i < TuneRegionList->Count ; i++){ |
| +--+---------------------------------------------+
474 | +--- TuneRegion = (TTuneRegion *)TuneRegionList->Items[i];
| | +------------------------------------------+
475 | +--+ if(TuneRegion->TuneGroup == tgInstall){ |
| | +--+---------------------------------------+
476 | | +--- fprintf(fp," if (index(ABCLib_Routines,'%s') .ne. 0) then\n",TuneRegion->Name);
477 | | +--- fprintf(fp," call ABCLib_ATexecInstall%s(ABCLib_Routines)\n",TuneRegion->Name);
478 | | +--- fprintf(fp," endif\n");
| | +-+---+
479 | | | } |
| | +-----+
| +-+---+
480 | | } |
| +-----+
481 +--- fprintf(fp," endif\n");
482 +--- fprintf(fp,"\n");
483 +--- fprintf(fp,"c ==== Before Execution-invocation Optimization\n");
484 +--- fprintf(fp," if (ABCLib_TYPE .eq. 2) then\n");
485 +--- // fprintf(fp," call ABCLib_ATexecStatic(ABCLib_Routines)\n");
486 | // for(i = TuneRegionList->Count-1 ; i >= 0 ; i--){
| +------------------------------------------------+
487 +--+ for(i = 0 ; i < TuneRegionList->Count ; i++){ |
| +--+---------------------------------------------+
488 | +--- TuneRegion = (TTuneRegion *)TuneRegionList->Items[i];
| | +----------------------------------------+
489 | +--+ if(TuneRegion->TuneGroup == tgStatic){ |
| | +--+-------------------------------------+
490 | | +--- fprintf(fp," if (index(ABCLib_Routines,'%s') .ne. 0) then\n",TuneRegion->Name);
491 | | +--- fprintf(fp," call ABCLib_ATexecStatic%s(ABCLib_Routines)\n",TuneRegion->Name);
492 | | +--- fprintf(fp," endif\n");
| | +-+---+
493 | | | } |
| | +-----+
| +-+---+
494 | | } |
| +-----+
495 +--- fprintf(fp," endif\n");
496 +--- fprintf(fp,"\n");
497 +--- fprintf(fp,"c ==== Run-time Optimization\n");
498 +--- fprintf(fp," if (ABCLib_TYPE .eq. 3) then\n");
499 +--- // fprintf(fp," call ABCLib_ATexecDynamic(ABCLib_Routines)\n");
500 | // for(i = TuneRegionList->Count-1 ; i >= 0 ; i--){
| +------------------------------------------------+
501 +--+ for(i = 0 ; i < TuneRegionList->Count ; i++){ |
| +--+---------------------------------------------+
502 | +--- TuneRegion = (TTuneRegion *)TuneRegionList->Items[i];
| | +------------------------------------------+
503 | +--+ if(TuneRegion->TuneGroup == tgDynamic){ |
| | +--+---------------------------------------+
504 | | +--- /// fprintf(fp," if (index(ABCLib_Routines,'%s') .ne. 0) then\n",TuneRegion->Name);
505 | | | // fprintf(fp," call ABCLib_ATexecDynamic%s(ABCLib_Routines)\n",TuneRegion->Name);
506 | | +--- fprintf(fp," ABCLib_DYNAMICTUNE = .true.\n");
507 | | +--- /// fprintf(fp," endif\n");
| | +-+---+
508 | | | } |
| | +-----+
| +-+---+
509 | | } |
| +-----+
510 +--- fprintf(fp," endif\n");
511 +--- fprintf(fp,"\n");
512 +--- fprintf(fp," return\n");
513 +--- fprintf(fp," end\n");
514 +--- fprintf(fp,"c ============================================================\n");
515 +--- fprintf(fp,"\n");
516 +--- fprintf(fp,"\n");
517 |
518 +--- //
519 | // ABCLib_ATexecGGGFFF サブルーチンのコードの生成 (時間計測->ファイル)
520 | //
521 +--- // for(i = TuneRegionList->Count-1 ; i >= 0 ; i--){
| +------------------------------------------------+
522 +--+ for(i = 0 ; i < TuneRegionList->Count ; i++){ |
| +--+---------------------------------------------+
523 | +--- TuneRegion = (TTuneRegion *)TuneRegionList->Items[i];
524 | +--- TuneRegion->OutputAutoExecCode(fp);
| +-+---+
525 | | } |
| +-----+
| +------------------------------------------------+
526 +--+ if(FittingF){ // Fitting用サブルーチンを追加 |
| +--+---------------------------------------------+
527 | +--- FILE *fpSrc;
528 | +--- char cBuff[1024];
529 | +--- AnsiString fname;
530 | +--- AnsiString DirName;
531 | |
532 | +--- fname = MainF->SrcFileName;
533 | +--- DirName = ExtractFileDir(Application->ExeName);
534 | +--- fname = DirName + "\\abc_Data\\ControlSubrutions.f";
535 | +--- fpSrc = fopen(fname.c_str(),"rt"); // 出力ファイル
| | +--------------------+
536 | +--+ if(fpSrc == NULL){ |
| | +--+-----------------+
537 | | +--- MainF->err("ファイル " + fname + "が開けません。");
| | +-+---+
538 | | | } |
| | +-+---+
| | +-+-------+
538 | | | else{ |
| | +-+-------+
| | | +--------------------------------------------------+
539 | | +--+ while(fgets(cBuff,sizeof(cBuff),fpSrc) != NULL){ |
| | | +--+-----------------------------------------------+
540 | | | +--- fprintf(fp,"%s",cBuff);
| | | +-+---+
541 | | | | } |
| | | +-----+
542 | | +--- fclose(fpSrc);
| | +-+---+
543 | | | } |
| | +-----+
| +-+---+
544 | | } |
| +-----+
545 +--- //
+-+---+
546 | } |
+-----+