Changeset c036ddb in sasmodels for sasmodels/generate.py
- Timestamp:
- Aug 7, 2018 8:45:45 PM (6 years ago)
- Branches:
- master, core_shell_microgels, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- 7e923c2
- Parents:
- 7b0abf8
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/generate.py
r01c8d9e rc036ddb 671 671 672 672 673 # type in IQXY pattern could be single, float, double, long double, ...674 673 _IQXY_PATTERN = re.compile(r"(^|\s)double\s+I(?P<mode>q(ac|abc|xy))\s*[(]", 675 674 flags=re.MULTILINE) … … 701 700 return 'qa' 702 701 703 # type in IQXY pattern could be single, float, double, long double, ... 702 # Note: not presently used. Need to know whether Fq is available before 703 # trying to compile the source. Leave the code here in case we decide that 704 # define have_Fq for each form factor is too tedious and error prone. 704 705 _FQ_PATTERN = re.compile(r"(^|\s)void\s+Fq[(]", flags=re.MULTILINE) 705 def has_Fq(source): 706 def contains_Fq(source): 707 # type: (List[str]) -> bool 708 """ 709 Return True if C source defines "void Fq(". 710 """ 706 711 for code in source: 707 712 m = _FQ_PATTERN.search(code) … … 739 744 # for computing volume even if we allow non-disperse volume parameters. 740 745 partable = model_info.parameters 746 741 747 # Load templates and user code 742 748 kernel_header = load_template('kernel_header.c') 743 749 kernel_code = load_template('kernel_iq.c') 744 750 user_code = [(f, open(f).read()) for f in model_sources(model_info)] 751 745 752 # Build initial sources 746 753 source = [] … … 755 762 q, qx, qy, qab, qa, qb, qc \ 756 763 = [Parameter(name=v) for v in 'q qx qy qab qa qb qc'.split()] 764 757 765 # Generate form_volume function, etc. from body only 758 766 if isinstance(model_info.form_volume, str): … … 804 812 source.append(call_volume) 805 813 model_refs = _call_pars("_v.", partable.iq_parameters) 806 #create varaible BETA to turn on and off beta approximation 807 BETA = has_Fq(source) 808 if not BETA: 814 815 if model_info.have_Fq: 816 pars = ",".join(["_q", "&_F1", "&_F2",] + model_refs) 817 call_iq = "#define CALL_FQ(_q, _F1, _F2, _v) Fq(%s)" % pars 818 clear_iq = "#undef CALL_FQ" 819 else: 809 820 pars = ",".join(["_q"] + model_refs) 810 821 call_iq = "#define CALL_IQ(_q, _v) Iq(%s)" % pars 811 else: 812 pars = ",".join(["_q", "&_F1", "&_F2",] + model_refs) 813 call_iq = "#define CALL_IQ(_q, _F1, _F2, _v) Fq(%s)" % pars 822 clear_iq = "#undef CALL_IQ" 814 823 if xy_mode == 'qabc': 815 824 pars = ",".join(["_qa", "_qb", "_qc"] + model_refs) … … 820 829 call_iqxy = "#define CALL_IQ_AC(_qa,_qc,_v) Iqac(%s)" % pars 821 830 clear_iqxy = "#undef CALL_IQ_AC" 822 elif xy_mode == 'qa' :831 elif xy_mode == 'qa' and not model_info.have_Fq: 823 832 pars = ",".join(["_qa"] + model_refs) 824 833 call_iqxy = "#define CALL_IQ_A(_qa,_v) Iq(%s)" % pars 825 834 clear_iqxy = "#undef CALL_IQ_A" 835 elif xy_mode == 'qa' and model_info.have_Fq: 836 pars = ",".join(["_qa", "&_F1", "&_F2",] + model_refs) 837 # Note: uses rare C construction (expr1, expr2) which computes 838 # expr1 then expr2 and evaluates to expr2. This allows us to 839 # leave it looking like a function even though it is returning 840 # its values by reference. 841 call_iqxy = "#define CALL_FQ_A(_qa,_F1,_F2,_v) (Fq(%s),_F2)" % pars 842 clear_iqxy = "#undef CALL_FQ_A" 826 843 elif xy_mode == 'qxy': 827 844 orientation_refs = _call_pars("_v.", partable.orientation_parameters) … … 840 857 if p.type == 'sld'] 841 858 # Fill in definitions for numbers of parameters 842 source.append("#define BETA %d" %(1 if BETA else 0))843 859 source.append("#define MAX_PD %s"%partable.max_pd) 844 860 source.append("#define NUM_PARS %d"%partable.npars) … … 848 864 source.append("#define PROJECTION %d"%PROJECTION) 849 865 # TODO: allow mixed python/opencl kernels? 850 ocl = _kernels(kernel_code, call_iq, c all_iqxy, clear_iqxy, model_info.name)851 dll = _kernels(kernel_code, call_iq, c all_iqxy, clear_iqxy, model_info.name)866 ocl = _kernels(kernel_code, call_iq, clear_iq, call_iqxy, clear_iqxy, model_info.name) 867 dll = _kernels(kernel_code, call_iq, clear_iq, call_iqxy, clear_iqxy, model_info.name) 852 868 853 869 result = { … … 855 871 'opencl': '\n'.join(source+ocl[0]+ocl[1]+ocl[2]), 856 872 } 857 #print(result['dll'])858 873 return result 859 874 860 875 861 def _kernels(kernel, call_iq, c all_iqxy, clear_iqxy, name):876 def _kernels(kernel, call_iq, clear_iq, call_iqxy, clear_iqxy, name): 862 877 # type: ([str,str], str, str, str) -> List[str] 863 878 code = kernel[0] … … 869 884 '#line 1 "%s Iq"' % path, 870 885 code, 871 "#undef CALL_IQ",886 clear_iq, 872 887 "#undef KERNEL_NAME", 873 888 ] … … 1075 1090 model_info = make_model_info(kernel_module) 1076 1091 source = make_source(model_info) 1077 #print(source['dll'])1092 print(source['dll']) 1078 1093 1079 1094
Note: See TracChangeset
for help on using the changeset viewer.