Changeset f2f67a6 in sasmodels for sasmodels/generate.py
- Timestamp:
- Apr 15, 2016 5:26:24 PM (8 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- ae2b6b5, 38a9b07, eb97b11
- Parents:
- 0ff62d4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/generate.py
ra5b8477 rf2f67a6 173 173 174 174 try: 175 from typing import Tuple, Sequence, Iterator 175 from typing import Tuple, Sequence, Iterator, Dict 176 176 from .modelinfo import ModelInfo 177 177 except ImportError: … … 298 298 Return a timestamp for the model corresponding to the most recently 299 299 changed file or dependency. 300 301 Note that this does not look at the time stamps for the OpenCL header 302 information since that need not trigger a recompile of the DLL. 300 303 """ 301 304 source_files = (model_sources(model_info) … … 304 307 newest = max(getmtime(f) for f in source_files) 305 308 return newest 309 310 def model_templates(): 311 # type: () -> List[str] 312 # TODO: fails DRY; templates appear two places. 313 # should instead have model_info contain a list of paths 314 # Note: kernel_iq.cl is not on this list because changing it need not 315 # trigger a recompile of the dll. 316 return [joinpath(TEMPLATE_ROOT, filename) 317 for filename in ('kernel_header.c', 'kernel_iq.c')] 306 318 307 319 def convert_type(source, dtype): … … 377 389 return _template_cache[filename][1] 378 390 379 def model_templates():380 # type: () -> List[str]381 # TODO: fails DRY; templates are listed in two places.382 # should instead have model_info contain a list of paths383 return [joinpath(TEMPLATE_ROOT, filename)384 for filename in ('kernel_header.c', 'kernel_iq.c')]385 386 391 387 392 _FN_TEMPLATE = """\ … … 390 395 %(body)s 391 396 } 392 393 397 394 398 """ … … 467 471 # Load templates and user code 468 472 kernel_header = load_template('kernel_header.c') 469 kernel_code = load_template('kernel_iq.c') 473 dll_code = load_template('kernel_iq.c') 474 ocl_code = load_template('kernel_iq.cl') 470 475 user_code = [open(f).read() for f in model_sources(model_info)] 471 476 … … 506 511 if _have_Iqxy(user_code): 507 512 # Call 2D model 508 refs = ["q[2* i]", "q[2*i+1]"] + _call_pars("_v.", partable.iqxy_parameters)513 refs = ["q[2*_i]", "q[2*_i+1]"] + _call_pars("_v.", partable.iqxy_parameters) 509 514 call_iqxy = "#define CALL_IQ(_q,_i,_v) Iqxy(%s)" % (",".join(refs)) 510 515 else: … … 521 526 # TODO: allow mixed python/opencl kernels? 522 527 523 # define the Iq kernel 524 source.append("#define KERNEL_NAME %s_Iq"%model_info.name) 525 source.append(call_iq) 526 source.append(kernel_code) 527 source.append("#undef CALL_IQ") 528 source.append("#undef KERNEL_NAME") 529 530 # define the Iqxy kernel from the same source with different #defines 531 source.append("#define KERNEL_NAME %s_Iqxy"%model_info.name) 532 source.append(call_iqxy) 533 source.append(kernel_code) 534 source.append("#undef CALL_IQ") 535 source.append("#undef KERNEL_NAME") 536 528 source.append("#if defined(USE_OPENCL)") 529 source.extend(_add_kernels(ocl_code, call_iq, call_iqxy, model_info.name)) 530 source.append("#else /* !USE_OPENCL */") 531 source.extend(_add_kernels(dll_code, call_iq, call_iqxy, model_info.name)) 532 source.append("#endif /* !USE_OPENCL */") 537 533 return '\n'.join(source) 534 535 def _add_kernels(kernel_code, call_iq, call_iqxy, name): 536 # type: (str, str, str, str) -> List[str] 537 source = [ 538 # define the Iq kernel 539 "#define KERNEL_NAME %s_Iq"%name, 540 call_iq, 541 kernel_code, 542 "#undef CALL_IQ", 543 "#undef KERNEL_NAME", 544 545 # define the Iqxy kernel from the same source with different #defines 546 "#define KERNEL_NAME %s_Iqxy"%name, 547 call_iqxy, 548 kernel_code, 549 "#undef CALL_IQ", 550 "#undef KERNEL_NAME", 551 ] 552 return source 538 553 539 554 def load_kernel_module(model_name): 540 555 # type: (str) -> module 556 """ 557 Return the kernel module named in *model_name*. 558 559 If the name ends in *.py* then load it as a custom model using 560 :func:`sasmodels.custom.load_custom_kernel_module`, otherwise 561 load it from :mod:`sasmodels.models`. 562 """ 541 563 if model_name.endswith('.py'): 542 564 kernel_module = load_custom_kernel_module(model_name)
Note: See TracChangeset
for help on using the changeset viewer.