Вопросы с тегами [fortran]

1

голосов
1

ответ
345

Просмотры

«__Gfortran_pow_c8_i4» ошибка при связывании .o файлов с г ++ и gfortran с помощью г ++

Я пытаюсь связать файл .o сгенерированный с помощью г ++ и другой файл .o сгенерированный с помощью gfortran. г ++ -c mycppcode.cpp производит файл mycppcode.o и команду gfortran -c myfortrancode.f производит файл myfortrancode.o Когда я связать эти два файла, чтобы получить выходной файл г ++ -О mycppcode.o myfortrancode.o я получаю следующие ошибки неопределенные символы для архитектуры x86_64: «__gfortran_pow_c8_i4», ссылочные от: Может ли кто-нибудь помочь мне с этим? Должен ли я использовать другой компилятор? Кроме того, я хотел бы знать, какие функции или подпрограммы называют «__gfortran_pow_c8_i4», так что я могу попробовать, чтобы избежать этих функций или подпрограмм в Фортране в будущем.
John Smith
1

голосов
2

ответ
254

Просмотры

Ошибка: Отсутствует запятая в формате заявления

Мои коды записаны ниже: ИЗМЕРЕНИИ T (10) DATA A, B /9.,5./ IS = 1, J = J + 3 Т (J-2) = АТ (J-1) = АВ 80 Т (J), = Т (1) + T (J-1), J = J + 1, если (J.NE.10) GOTO 80 DO I = 1,5 WRITE (*, 15) Я, Т (J) END DO 15 FORMAT ( 'Т (' I2 ') =', F8.4) СТОП END компилирование Моя ошибка записывается следующим образом: jdoodle.f95: 13: 16: 15 FORMAT ( 'T (' IS ') =', F8.4) 1 Error : GNU Extension: Отсутствует запятая (1) jdoodle.f95: 11: 20: WRITE (*, 15) I, T (J) 1 Ошибка: сформатируйте 15 в (1) не определено не могли бы вы сказать мне, где ложное утверждение моего Fortran кода? Результат должен быть Т (1) = nnn.0nnn мне кажется.
Bay
1

голосов
0

ответ
56

Просмотры

Windows, 10 TFS 2015 «предел Json превысил» Ошибка при компиляции Fortran решений

Я устанавливал Windows 10 машины для запуска определения построения XML на TFS 2015. Когда он работает (None интерактивный режим), мы получаем «предел Json превышено» ошибка в середине сборки. это провал случайным образом различных мест сборки. что может быть причиной этого? Это всегда не удалось, когда он компилирует Fortran решений. У нас есть несколько Fortran решений. Он не потерпел неудачу в любом конкретном месте. Иногда при составлении первого, а иногда и другие решения. Мы можем строить эти решения с помощью командной строки (с помощью этой команды «devenv.com PathToFotranSolution / сборки Release»). Мы используем 'Intel (R) Parallel Studio XE 2018 Update 1'. Все нормально в ОС Windows 7 сборки среды (протестировано Windows 7 с TFS 2012 и TFS 2015. Оба были в порядке).
Kinsly
1

голосов
1

ответ
160

Просмотры

Fortran граф вызовов при переменном уровне с использованием Doxygen

Я знаю, что с помощью Doxygen можно создавать графики вызовов блоков в Фортран кода. Эти графики показывают вызов отношения между вызывающим абонентом и вызываемыми блоками. Doxygen в моем опыте организован по модульному принципу. В Fortran это означает, что каждая подпрограмма, функция или модуль может иметь документацию, включая то, что переменные в нем, и как это имеет отношение (с помощью вызова графа) для других функций, модулей и подпрограмм. Мой вопрос, может Doxygen код ручки на уровне переменных? Значение Я хотел бы генерировать графы вызовов или графики фактических переменных потока внутри подпрограммы, так что взаимосвязи между переменными можно сделать? Если Doxygen не может это сделать, что можно? Я предпочел бы иметь систематический и эффективный способ наметить программное обеспечение, а не отладке вещи и того, чтобы всегда зафиксировать их в памяти человека ...
user32882
1

голосов
0

ответ
62

Просмотры

Fortran 2008 - User-Defined I / O указателей класса, содержащий

Процедура :: print_info => print_info_impl!> Сохраняет экземпляр сети Фортрана бинарного файла процедуры :: save_net_bin => save_net_bin_impl!> Реализация функции записи позволяет хранить !! Массивы. выделены, Процедура :: write_sample => write_sample_impl!> Реализация функции чтения позволяет читать !! весь экземпляр net_t хранится в виде двоичного файла. Процедура :: read_sample => read_sample_impl родовое :: записи (неформатированный) => write_sample родовое :: чтение (неформатированный) => read_sample конечного типа net_t мне нужно реализовать собственный чтения и записи функции, чтобы иметь возможность сериализации экземпляров net_t потому, что он содержит размещаемые массивы. Я пытался реализовать функцию записи, как это: подпрограмма write_sample_impl (это, устройство, IOSTAT, iomsg) класс (net_t), намерение (в) :: это целое число, намерение (в) :: блок целое, намерение (уходит) :: IOSTAT символ (*), намерение (INOUT) :: iomsg целое :: я! < Счетчик! Написать запись дает размеры для записи распределения (единица измерения, IOSTAT = IOSTAT, iomsg = iomsg) Размер (это% neuron_arr), & размер (этот% input_neuron_arr), & размер (этот% output_neuron_arr), & размер (этот% connection_arr) написать (единица, IOSTAT = IOSTAT, iomsg = iomsg) (это% neuron_arr (я)% get_id (), & это% neuron_arr (I)% get_potential (), & это% neuron_arr (I)% get_state (), & Передача данных элемента в точке (1) не может быть полиморфными, если она не обрабатывается определенной процедуры ввода / вывода этого% connection_arr (я)% get_output_neuron (), & 1 Ошибка: элемент передачи данных в точке (1) не может быть полиморфными, если она не обрабатывается по определенной процедуре ввода / вывода Я вижу проблему в том, что класс connection_t содержит указатели на нейроны, как мы можем видеть здесь:> представляет соединение между двумя нейронами. типа, распространяется (abstract_base_t) :: connection_t частный класс (neuron_t), указатель :: input_neuron! <Указатель на класс входных нейронов (neuron_t), указатель :: output_neuron! <Указатель на нейрон реального выхода (вид = real_4neuro) :: вес <! Вес соединения содержит! Реализация методов конечного типа connection_t Можно ли сериализовать указатели на этом пути? Я хотел использовать нейроны для предотвращения копирования самих neuron_t экземпляров.
Eenoku
1

голосов
0

ответ
24

Просмотры

При выполнении этого FORtran 95 кода дает мне PARAB ошибки - в файл hammer.f95 в строке 221 [+0203] главная - в файл hammer.f95 в строке 171 [+ 2e49]

При выполнении этого FORtran 95 код дает мне PARAB ошибки - в файле hammer.f95 в строке 221 [+0203] главный - в файле hammer.f95 в строке 171 [+ 2e49] Это показывает, что ссылка на неопределенную переменную, элемент массива или результат функции Это показывает эту ошибку на «у» вектора, но я уже определил его, давая семь входов в «у» вектор программа молота! Анализ гидроудар в трубопроводе, вызванное открытием или закрытием! нижестоящего клапан! Трубопровод может иметь до 10 труб в серии, и каждая труба может иметь до 100 вычислительных узлов!; это ограничение может быть увеличено! изменяя размер заявление! регулируют скорость волны, в случае необходимости, чтобы избежать ошибок интерполяции! Относительное отверстие клапана против кривого времени задаются в дискретных точках и! значения в промежуточный раз определяется параболической интерполяцией! единицы СИ используются здесь. ! ==================== Notation ====================! ! а = скорость волны (м / с)! ар = трубы C / S площадь (м2)! д = диаметр трубы (м)! дт = интервал вычислительного времени (s)! DXT = временной интервал для хранения тау в зависимости от времени кривой (ы)! е = дарсите-Weisbach коэффициент трения! ч = piexometric головка в начале временного интервала (м)! Hmax = Максимальный напор пьезометрическая (м)! HMIN = минимальная высота piezometrci (м)! л.с. = пьезометрическую головой в конце временного интервала (м)! HRES = НПУ выше ИГД (м)! вс = потеря головки клапана для потока QS (м)! iprint = число интервал времени, после которого состояние должны быть напечатаны! L = длина трубы (м)! м = количество точек на тау против кривого времени! п = число достигает, в котором труба разделена! нп = количество труб! nrlp = число достигает на последней трубе! д = разряд в начале временного интервала (м3 / с)! Qo = стационарное состояние разряд (м3 / с)! QP = разряд в конце временного интервала (м3 / с)! QS = выпускной клапан (м3 / с)! т = время (s)! тау = относительное отверстие клапана! Tauf = окончательное открытие клапана! tauo = начальное открытие клапана! tlast = время ДО, какие условия должны быть вычислены (ы)! тв = открытие клапана или время закрытия (ы)! у = сохраненные значения тау! ============================================ ====! неявное ни один реальный, размер (10100) :: д, д, QP, л.с., Hmax, HMIN реальный, размер (10) :: ча, е, ср, ар, а, л, п, д, у, ап, aunadj , Скорректированная скорость волны '/ 27x' (м / с)! ') вычисление констант трубы делают I = 1, Np ар (я) = 0.7854 * D (I) * д (я) aunadj (я) = а (I) ап (I) = L (I) / (дт * а ( я)) п (я) = ап (I), Эни (I) = N (I), если (ап (я) -ань (я)> = 0,5) N (I) = N (I) +1 A (I ) = L (I) / (дт * п (я)) запись (*, 10) я, а (я) формата 10 (10x, i3,12x, F7.1) ча (я) = G * (I ар ) / а (я) ср (я) = F (I) * дт / (2,0 * д (я) * ар (я)) F (I) = F (I) * L (I) / (2.0 * г * д (я) * п (я) * ар (я) * ар (я)) конец делать! Расчет стационарного состояния ч (1,1) = HRES сделать я = 1, нп пп = п (я) +1 делать J = 1, Nn час (I, J) = H (я, 1) - (J-1) * F (I) * Qo * Qo д (I, J) = Qo конечное делать ч (г + 1, 1) = Н (я, пп) конец делать Nn = п (Np) +1, если (Qo / = 0.) HS = Н (нп, пп) сделать = 1, нп пп = п (я) +1 сделать = 1, пп Hmax (I, J) = H (I, J) HMIN (I, J) = H (I, J) конец делать конец делают NP1 = NP1 т = 0,0 тау = tauo записи (*, 11) формат 11 (/ 8x, 'Time', 2x, 'тау', 2x, 'трубы', 7x, 'Голова (м)', 7x, 'Диш.', '(м3 / с)' / 20x, 'Нет', 5x, '(1)', 5x, '(п + 1)', 5x, '(1)', 5x, '(п + 1)' / ) 128 к = 0 = 1 пп = п (я) +1 записи (*, 12) т, тау, я, ч (я, 1), ч (я, пп), д (я, 1), Q (я, пп) формат 12 (f12.1, f6.3, i4,2f9.2, F9.3, F10.3), если (нп == 1) перейти к 14 сделать я = 2, нп пп = п ( я) +1 записи (*, 13) я, ч (я, 1), ч (1, пп), д (я, 1), д (я, пп) 13 формат (20x, i2,2f9.2, F9.3, F10.3) конец сделать 14 = Т + дт к = к + 1, если (т> tlast) перейти к 19! Вверх по течению коллектора л.с. (1, пп)) / ча (нп) перейти к 18 17 Qp (нп, пп) = 0,0 л.с. (нп, пп) = ф / ца (нп)! хранящие переменные для следующего временного шага 18 сделать = 1, Np пп = п (я) +1 сделать = 1, пп д (I, J) = Qp (I, J) Н (I, J) = л (я , к), если (ч (I, J)> Hmax (I, J)) Hmax (I, J) = H (I, J), если (ч (I, J) <HMIN (I, J)) HMIN ( I, J) = H (I, J) конец делать конец делать, если (к == iprint) перейти на 128 перейти к 14 19 записи (формат *, 20) 20 (/ 8x, 'трубы нет.', 3x,» Раздел нет. '3x,' Макс пресс., 3x, 'Min нажмите.' /) сделать я = 1, нп пп = п (я) +1 сделать у = 1, пп записи (*, 21) я, J, Hmax (I, J), HMIN (I, J) формат 21 (9x, i2,13x, i2,2f13.2) конец этого конца делают остановки конца программы молоток подпрограммой parab (т, ЦТС, у, тау) неявное ни один реальный,
Arjun Garva
1

голосов
1

ответ
124

Просмотры

Numpy Distutils не распознает Fortran типов файлов

Я пытаюсь написать пакет питона с Anaconda3, который включает в себя некоторые скомпилированные Fortran библиотеки. На основании приведенных примеров в Интернете, мне нужно использовать numpy.distutils.core.Extension правильно иметь сборку расширения. Вот мой несколько -минимальный рабочий пример каталог: MANIFEST.in setup.py бин └─── test_smat мойпакет ├─── __init__.py ├─── скомпилирован | ├─── __init__.py | └─── gaussian.f90 └─── pystuff ├─── __init__.py └─── buildmat.py MANIFEST.in содержит: рекурсивные включает мойпакет * .f90 setup.py содержит: от Setuptools импорта find_packages из Setuptools импорт установка из numpy.distutils.core импорта Extension ext_modules = [Расширение ( 'mypkg.compiled.gaussian', источники = [ 'мойпакет / сост / gaussian.f90'])] настройка (имя = 'мойпакет', версия = '0.1' , Описание = 'Это должно работать', пакеты = find_packages (), скрипты = [ 'бен / test_smat'], install_requires = [ 'NumPy> = 1.7.0'], ext_modules = ext_modules) gaussian.f90 содержит (EDIT: упрощенный) :! ! Рассчитывает перекрытие между двумя гауссианов! Подпрограмма перекрытия (x1, x2, a1, a2, S), ни одна неявной двойной точности, намерение (в) :: x1, x2, a1, a2 двойной точности, намерение (уходит) :: S двойной точности, параметр :: пи = Atan (1. а) печать (коврик), если __name__ == «__main__»: основной () В идеале, я должен быть в состоянии установить с питоном setup.py установить и запустить test_smat, чтобы получить печатную продукцию. Однако, когда я пытаюсь установить я получаю: запуск установки работает bdist_egg работает egg_info писать mypkg.egg-инфо / PKG-INFO сочинительство dependency_links для mypkg.egg-информация / требования письма dependency_links.txt к mypkg.egg-инфо / требуется. ) Могу ли я что-то отсутствует, что говорит Numpy Distutils, что расширение файла Fortran 90? Другие примеры на этом сайте, кажется, есть файл setup.py, который так же просто, не встречая эту ошибку. Изменение Fortran расширения на .f95 или .f приводит к тому же типу ошибке.
R MacDonell
1

голосов
0

ответ
74

Просмотры

Как сделать 2 Fortran подпрограммы имеют один и тот же выходной файл?

Мне нужен код для записи данных из двух кругов, чтобы экспортировать его в виде анимации (VMD). Это должно дать мне около 6000 данных (3000 по окружности). Когда я запускаю программу, она только записывает данные первого круга. Как я пишу эти два набора данных в одном файле? Вот код, который я использовал программу Circulo неявного двойной точность (AH, OZ) Характер * 4 W1, W6 символов * 4 W2, W7 Open (3, файл = 'circular.xyz', доступ = 'Append', действие = "чтения и записи ') открыто (9, файл =' circular.dat», форма = 'отформатирован', действие = 'чтение и запись') Вызов Circular1 Вызов Circular2 Stop End с ***************** ************************************************** ************ Подпрограмма Circular1 неявная двойная точность (АГИ, ОЗ) Размер х (9000), у (9000),
Angel Uriel
1

голосов
0

ответ
88

Просмотры

Проблема памяти с Фортраном функциями, собранных с разведданными [дублировать]

Этот вопрос уже есть ответ здесь: сбой программы для копирования массива с ifort 2 ответы Как я могу избежать переполнения стека, когда Fortran производит большой, внутренний, временный массив? 1 ответ переполнения стека в Fortran 90 6 ответов я испытываю некоторые проблемы, которые, как представляется из обработки в моем коде памяти. Мне удалось локализовать проблему в следующем примере. Она возвращает ошибку сегментации (ядро сбрасывали) итерации 1024 (именно поэтому я начал цикл в 1000) при компиляции с Intel, но не с gfortran. Если вызов функции закомментирован, вызов подпрограммы будет продолжать работать, по крайней мере, до конца цикла. Теория, что при вызове функции, gfortran является извлечение памяти для DMAT из кучи, в то время как Intel является извлечение его из стека. Так ли это? Есть еще что-то происходит? Это означало бы, что для того, чтобы мой код, чтобы адекватно масштабироваться и поддержка Intel компиляции, я должен определить все мои процедуры, подпрограммы и просто отказаться от функций? Тестовый пример: модуль auxmod неявное никто не содержит функцию matmul3_fun (Амат, BMAT, CMAT) результат (DMAT) неявное ни в реальном * 8, намерение (в) :: Амат (:, :) реальный * 8, намерение (в) :: BMAT (:, :) реальный * 8, намерение (в) :: CMAT (:, :) реальный * 8 :: DMAT (размер (BMAT, 1), размер (BMAT, 2)) в реальном * 8, размещаемый :: ЭМАП (:, :) выделить (ЭМА (размер (BMAT, 1), размер (BMAT, 2))) ЭМАП = matmul (Амат, BMAT) DMAT = matmul (ЭМАП, CMAT) конец функции matmul3_fun подпрограммы matmul3_sub (Амат, BMAT, CMAT,
Nordico
1

голосов
0

ответ
69

Просмотры

Intel Fortran: use of elemental intrinsic in parameterized type definition

Я использую параметризованных типа grid_f (g_size), который имеет реальный массив размерности (max0 (something_1, something_2)). Каким-то образом ifort компилятор оленья кожа, как это, в результате внутренней ошибки. Модуль неявный лей никто, кроме целого, параметр :: нг = 10, дп = 8 типа grid_f (g_size) целого числа, длина :: g_size реального (др), размера (max0 (2 * g_size + 10, g_size)) :: вала конец тип содержит подпрограмму grid_reset (Func) неявное ни один тип (grid_f (нг)) :: FUNC FUNC% Val = 0D0 конец подпрограммы конца grid_reset_orb модуль MDL Компиляция: ifort -c check.f90 check.f90 (10): Ошибка # 7974: элементная внутренняя функция здесь должна быть целочисленным типа, и каждый аргумент должен быть выражением инициализации типа целого числа или символа. [MAX0] реальные (др), размер (max0 (2 * g_size + 10, g_size)) :: Вэл -------------------------- ^ check.f90 (17): Внутренняя ошибка: Пожалуйста, посетите «http://www.intel.com / программное обеспечение / продукты / поддержка»для помощи. тип (grid_f (нг)) :: функ ^ [Aborting из-за внутренней ошибки. ] Компиляция прерывается для check.f90 (код 1) Использование макс или jmax0 вместо не помогает. Какие-либо предложения? Edit: тема сейчас на сайте Intel, нажмите кнопку. Это, кажется, ошибка в ifort16 и ifort17 с грохотом компилятором и в результате ошибки в 18 и 19м, хотя она должна быть стандартной.
zufall
1

голосов
0

ответ
54

Просмотры

Как использовать многопроцессорных для вложенной сделать петлю в Fortran?

У меня есть вложенный цикл, который содержит 3 счетчиков (I, J и К). так как я запускаю этот код на компьютере, который имеет многопроцессорной процессор с 8 ядрами. Я намерен удалить внутренний сделать петлю (сделать к =) и сделать код идут параллельно, так что каждый отдельный сердечник вычисления F (I, J, K), если K = N (N = 1,2, ..., 8). может кто-нибудь помочь с этим? у = 1, пг сделать J = 1, пу ли к = 1,8 F (I, J, K) = omegaP * F (I, J, K) + омега * FEQ (I, J, K) + Fi (I, J, K) * дт конец сделать конец сделать конец сделать
Nima Ghomri
1

голосов
0

ответ
100

Просмотры

Python 3.7 компилируется Fortran PYD (DLL) не работает. [WinError 1114] рутина динамическая библиотека (DLL), инициализация не удалось

Я пытаюсь помочь Коллега получить Fortran модуль компилируется и работает на нашем сервере. Он способен скомпилировать / запустить его локально на своей машине, но когда я пытаюсь воспроизвести среду на наших серверах ксенона, модуль не будет загружен в сценарии. Окружающая среда: WinServer 2012R2 с Intel (R) Xeon (R) CPU E5-2697 v2 Составитель: tdm64-GCC-5.1.0-2.exe (с FORtran поддержкой проверяется во время установки) версия Anaconda: 4.5.11 Python версии: Python 3.7.1 (по умолчанию, 28 Октябрь 2018, 8:39:03) [MSC v.1912 64 бит (AMD64)] :: Anaconda, Inc. по команде win32 компиляции: питон C: \ ProgramData \ Anaconda3 \ envs \ python_server \ Сценарии \ f2py.py -m nnpx -c --fcompiler = gnu95 --compiler = mingw32 nnpx.f90 --f90flags = "- mwindows -m64 -march = 'Ivybridge' -fopenmp -lgomp" Примечание: На самом деле я пытался число сочетаний этих F90 флагов, ни один из которых не казалось, волшебная комбинация. Модуль появится компилировать OK, и создает файл с именем «nnpx.cp37-win_amd64.pyd», что я размещение в той же папке, что и сценарий тестирования, показанной ниже Test питон скрипт пытается загрузить модуль (Пид): ### # НАЧАТЬ Сценарий Snippet ######################### импорта ctypes импорта PDB ctypes.WinDLL ( "nnpx.cp37-win_amd64.pyd") #; pdb.set_trace () ############################# импорт nnpx в пп #### END Snippet ##### Script #################### Вот ошибка я получаю при попытке загрузить DLL: (python_server) е: \ Python_Server \ Fortran> питон .. \ скрипты \ nnpx_test. ру Traceback (самый последний вызов последнего): Файл ".. \ скрипты \ nnpx_test.py", строка 24, в ctypes.WinDLL ( "nnpx.cp37-win_amd64.pyd") Файл «C: \ ProgramData \ Microsoft \ Windows \ WER \ ReportQueue \ AppCrash_python.exe_b5aa8e775891040bdd452465e375c1e92ab7d9_c1c75637_cab_3e80c082 \ triagedump.dmp Эти файлы могут быть доступны здесь: C: \ ProgramData \ символ Microsoft \ Windows \ WER \ ReportArchive \ AppCrash_python.exe_b5aa8e775891040bdd452465e375c1e92ab7d9_c1c75637_3cf0dd9f Анализ: Последующая проверка для решения: 0 Пожаловаться Id: 941538b8-e9d8-11e8-810d-d89d67f4dd04 Отчет Статус: 0 Хэшировано ведро: 19c0c60458b6bae2d9452925d6eb918a. Неисправность ведро, тип 0 Имя события: APPCRASH Ответ: Нет в наличии Cab Id: 0 Сигнатура проблемы: P1: P2 python.exe: 3.7.1150.1013 P3: 5bd5bc42 P4: libgfortran_64-3.dll P5: 0.0.0.0 P6: a688a670 P7: c0000005 P8: 0000000000018ae0 P9: P10: Прикрепленные файлы: C: \ Users \ myuserpin \ AppData \ Local \ Temp \ WERBAB7.tmp.appcompat.txt C: \ Users \ myuserpin \ AppData \ Local \ Temp \ WERC074.tmp.WERInternalMetadata. XML C: \ ProgramData \ Microsoft \ Windows \ WER \ ReportQueue \ AppCrash_python.exe_b5aa8e775891040bdd452465e375c1e92ab7d9_c1c75637_cab_3e80c082 \ memory.hdmp C: \ ProgramData \ Microsoft \ Windows \ WER \ ReportQueue \ AppCrash_python.exe_b5aa8e775891040bdd452465e375c1e92ab7d9_c1c75637_cab_3e80c082 \ triagedump.dmp Эти файлы могут быть доступны здесь: C: \ символ ProgramData \ Microsoft \ Windows \ WER \ ReportQueue \ AppCrash_python.exe_b5aa8e775891040bdd452465e375c1e92ab7d9_c1c75637_cab_3e80c082 Анализ: Последующая проверка для решения: 0 Идентификатор отчета: 941538b8-e9d8-11e8-810d-d89d67f4dd04 Отчет Статус: 4 Хэшировано ведро:. Faulting Имя приложения: python.exe, версия: 3.7.1150.1013, штамп времени: 0x5bd5bc42 Faulting имени модуля: libgfortran_64-3.dll, версия: 0.0.0.0, отметка времени: 0xa688a670 Код исключения: 0xc0000005 Fault смещение: 0x0000000000018ae0 Сбойного идентификатор процесса: 0x4d14 Сбойное время запуска приложения: путь к приложению 0x01d47de553900866 Сбойное: C: \ ProgramData \ Anaconda3 \ envs \ python_server \ python.exe Faulting путь модуля: C: \ TDM-GCC-64 \ Bin \ libgfortran_64-3.dll Id отчета: 941538b8- e9d8-11e8-810d-d89d67f4dd04 Сбойное пакет полное наименование: Сбойное пакет-относительный идентификатор приложения: Зависимость от проверки: Я также попытался проверки зависимостей, как предложено здесь, но не могу показаться, чтобы получить их гладить отлично (именно поэтому я предположим, что я не могу получить питона, чтобы правильно загрузить модуль). Я должен был скопировать «libgcc_s_seh_64-1.dll» и «libgfortran_64-3.dll» в ту же папку, что и файл PYD, а затем они показывают, как «правильно» на исследователе зависимости, но в «python37.dll» никогда получает правильную контрольную сумму. Я не знаю, если это имеет значение, но я пробовал каждую копию python37.dll (в каждой Конда среде) можно найти в моей системе, и ни одна работа. Все они дают мне «контрольную сумму неправильной» в проверках зависимостей. Любые мысли или предложения о том, как получить этот модуль FORTRAN, чтобы правильно загрузить в питон скрипт?
NumericOverflow
1

голосов
0

ответ
33

Просмотры

Установка pyOpt-1.2.0 дает collect2.exe ошибку

Я пытаюсь вышеупомянутый пакет на моих окон 64 бит питона. Изначально я получал «неспособную найти vcvarsall.bat» ошибку файла и я собрал это из-компилятора (или отсутствия). Для решения этой проблемы, я установил минималистский GNU компилятор. Имя составителя было Mingw64. После установки я увидел прогресс, но теперь я вижу, что пакет все еще установлен, что дает мне ошибку, Collect2.exe: Id вернулся с кодом 1 Я очень признателен, если кто-то может помочь мне отлаживать это. Мой питон версия 3.6.5
linearprogrammer
1

голосов
0

ответ
79

Просмотры

Принимая derviatives полиномов Лежандра в Fortran

Мой код компилируется, но он не работает должным образом. Я не уверен, является ли ее неспособность работать из-за математическую ошибку и / или, если есть проблема в моем кодировании синтаксиса. Код показан ниже. Если кто-нибудь может мне понять, что это не так, пожалуйста, дайте мне знать. Программа получила сигнал SIGSEGV: неисправность Сегментация - недопустимую ссылку памяти. Backtrace этой ошибки: # 0 0x7F1E52D74E08 # 1 # 2 0x7F1E52D73F90 0x7F1E526BB4AF # 3 0x400BBC в legendrepoly.3381 на project.f90 :? # 4 0x40138C в MAIN__ на project.f90 :? ошибка Сегментация программы Project (сбрасывали ядро) использовать iso_fortran_env неявное NONE целое (int32) :: Nmax! максимальный порядок полинома Лежандра целого числа (int32) :: шаг! размер шага под углом от 0 до 180 градусов в режиме реального (real64), параметр :: PI = 3,1415926 реальные (real64) :: му вещественным (real64) :: тета = 0 вещественных (real64), размер (:, :), размещаемый :: P, дп! Полином Лежандра целое (int32) :: к, з, п, л! Пользователь ввода печать *, «Пожалуйста, введите максимальный порядок полиномов Лежандра:» чтение (*, *) Nmax печать *, «Пожалуйста, введите целое размера шага (в градусах от 0 до 180):» чтение (*, *) шага! Выход му = соз (тета * (пи / 180.0_real64)) к = 180,0 / шаг Н = 2 * соз (реальный (шаг) * (пи / 180.0_real64)) выделяют (Р (Nmax + +1180)) выделяют (DP ( Nmax + 1180)) называть legendrepoly (л, мю, Nmax, шаг) печать *, Д.П. содержит подпрограмму legendrepoly (L, мю, Nmax, шаг) реальный (real64), размер (:, :), :: P быть выделена, Д.П. реальный (real64) :: реальный (real64), намерение (в) :: му целого число (Int32) :: я, Nmax, шаг число (Int32), намерение (в) :: ла = реальный (L) я = 1, 181,
Micah
1

голосов
0

ответ
110

Просмотры

PGI Cuda Fortran compiler failed to translate accelerator region

Я пишу простой код Cuda Fortran. Компилятор PGI сообщества издание 18,4, а версия CUDA является CUDA 9.0. При компиляции, она возвращает "PGF90-F-0155-компилятор не смог перевести ускорительную область (см -Minfo сообщения): Неожиданный вызов функции времени выполнения (test.CUF: 1)". Код с выше ошибками в нижней части описания. У меня есть сужать ошибку вниз к постановке «Je = UBound (а, 1)» в коде устройства. Тем не менее, (1) если заменить «UBOUND» с «LBound», то по крайней мере, проходит компиляцию; (2) если заменить «целое :: A (N)» с «целым числом :: а (:)» в коде устройства, он выполняет правильный расчет. Ошибка возникает в другом сложном коде, я сократить и упростить код здесь для диагностики, так что код ниже, может показаться своего рода странно.
S.C. Zheng
0

голосов
2

ответ
519

Просмотры

Why does using command PRINT in Fortran overwrite the input file?

Я пишу свой код и используя входной и выходной функции в Fortran. Код выглядит следующим образом (только для упрощения): ПРОГРАММА TEST РЕАЛЬНОГО, DIMENSION (1000) :: РЕАЛЬНОЙ :: B INTEGER :: T Определение входной и выходной ПРЕЗЕНТАЦИИ (UNIT = 1, FILE = 'input.dat', STATUS = 'OLD') ОТКРЫТО (UNIT = 2, FILE = 'output.dat', STATUS = 'NEW!') Чтение из файла "input.dat" READ (1, *) (A (I), I = 1, 1000)! Просто для начального условия B = 0.0 DO T = 1, 10 PRINT *, 'Step =', Т DO I = 1, 1000 в = в + 1,0 А (I) = A (I) / B END DO END БЫВАЕТ запись результатов в файл "output.dat" DO I = 1, 1000 WRITE (2,100) I, A (I) END DO 100 FORMAT (»», T3, I12, T17, F14.4) END PROGRAM TEST я был используя Gfortran 5.3 и результат не был похож на то, что я ожидал. Я ожидал, чтобы получить результат переменной T на экране (или терминала в Ubuntu OS), когда программа запущена и переменные I и A (I) записываются в файл output.dat. У меня не было проблем с переменными I и A (I), так как они были успешно записаны в файл output.dat. Проблема с переменной T, где он не появлялся на терминале, но это было написано в файл input.dat. Ну, даже предыдущий файл в файл input.dat не были перезаписаны. Может кто-нибудь дать мне предложение? FYI, я также попробовал на другой компилятор (с использованием ОС Windows), например: Microsoft Fortran электростанцией (очень старый): но он работал, как я ожидал. MinGW-w64 (GCC версии для Windows): но это не работает должным образом.
bob.bob.bob
1

голосов
0

ответ
46

Просмотры

Является транспонирование необходимо MPI рассеивает 3D массива в правильном направлении?

У меня есть вопрос о рассеянии данных с помощью функции MPI рассеяния. Я хотел бы, чтобы рассеять данные в точном пути, но я не знаю, если это возможно с помощью MPI разброса или если я должен преобразовать данные, а затем рассеивается. Например, у меня есть размер массива (х, у, г) 4,8,2 (таким образом, есть две 2D массивы). Теперь я хочу, чтобы рассеять ее до 4 процессов, каждый размер будет 4,2,2. Данные рассеяния в парование образом: Тем не менее, мне нужно данные рассеяния таким образом: Программа написана на языке Фортран. Функция Разброс в моей программе выглядит: CALL MPI_Scatter (TRANSPONSE_LOCAL_YZ (:,:, :), x_proc * у * z_proc, MPI_INT, TRANSPONSE_YZ (:, с: е, :), x_proc * у * z_proc, MPI_INT, 0, MPI_COMM_WORLD, MPI_Status, MPI_err)
Micchaleq
1

голосов
0

ответ
37

Просмотры

Фортран cudamalloc и проблема обертка cublassetmatrix

) Использовать iso_c_binding неявное Нет Тип (C_Ptr) :: обработки используют тестовый конец функции конец cublasCreate конца интерфейсный модуль программы CUDA iso_c_binding использование CUDA неявное ни целое, параметр :: = fp_kind вид (0.0) типа (C_PTR) :: cptr_A, cptr_A_D реальные ( fp_kind), размер (:, :), указатель :: А => NULL () в режиме реального :: TIME_START, time_end целое :: I, J, разреш, m1 целое число (c_int) :: х типа (c_ptr) :: обработки логического :: lsexit СИМВОЛОВ (Len = 50), POINTER :: errchar m1 = 500 Рез = cublasCreate (ручка), если (RES / = 0), то написать (*, *) "ERROR 1", Рез; конец, если Рез = cudaMallocHost (cptr_A, м1 * м1 * SizeOf (fp_kind)), если (RES / = 0) Тогда запись (*, *) "ОШИБКА 2", разрешение; конец, если вызов c_f_pointer (cptr_A, A, (/ m1, m1 /)) А = 1._fp_kind Рез = cudaMalloc (cptr_A_D, м1 * м1 * SizeOf (fp_kind)), если (RES / = 0) Тогда запись (*, *) "ERROR 3", разрешение; конец, если Рез = cublasSetMatrix (m1, m1, SizeOf (fp_kind), cptr_A, m1, cptr_A_D, m1), если (RES / = 0) Тогда запись (*, *) "ОШИБКА 4", разрешение, SizeOf (fp_kind) вызов c_f_pointer (cudageterrorstring (INT (Рез, вид = 8)), & & errchar, [Len (errchar)]) записи (*, *) обрезать (adjustl (errchar)) конец, если тест окончания программы команда делают это: TMP: ifort -O3 -o TMP $ (FFLAGS) tmp.f90 -L / Opt / CUDA / lib64 -lcublas -lcudart чистый: гт TMP cuda.mod Хотя "cudamallochost" ожидает "пустота ** PTR", кажется, работает, как Фортран указатель можно использовать, и, если положить в цикле с «cudafree» не вызывает утечку памяти. Код не в функции «cublassetmatrix» либо с кодом ошибки 7 ( «слишком много ресурсов» ) Или 11 ( "неверный аргумент"). Любая идея?
user1407220
1

голосов
0

ответ
48

Просмотры

How to synchronize in a Fortran do loop with OpenMP?

У меня есть цикл делать с двумя если заявлениями внутри. И я хочу, чтобы синхронизировать потоки после того как они закончат первые, если это означает, что я хочу, чтобы убедиться, что они все полное обновление первого если заявление, они могут начать обновлять вторую. Я пытался использовать $ OMP BARRIER, но общее время итерации! (Переменный: ITER) отличалось от серийного случая. Вот мой цикл обновления: DO ITER = 1, ITERMAX DUMAX = 0.0D0 $ OMP PARALLEL PRIVATE (I, J, K, P, T_OLD), Shared (T), СНИЖЕНИЕ! (MAX: DUMAX) $ OMP DO DO I = 2, N-1 DO, J = 2, N-1! ОБНОВЛЕНИЕ черных узлов ПЧ (MOD (I + J, 2) == 0) ТОГДА T_OLD = Т (I, J) T (I, J) = 0,25 * (T (I, J-1) + T (I, J + 1) + T (I + 1, J) + & Т (I-1, I) -DX ** 2 * S (I, J)) DUMAX = MAX (DUMAX, АБС (T_OLD-Т (I, J))) END IF END DO END DO! $ OMP END DO! $ OMP BARRIER! $ OMP DO DO K = 2, N-1 DO P = 2, N-1, если (MOD (K + P, 2) == 1) THEN T_OLD = Т (К, Р) Т (К, Р) = 0,25 * (Т (К, Р-1) + T ( К, Р + 1) + T (K + 1, Р) + & Т (К-1, Р) -DX ** 2 * S (K, P)) DUMAX = MAX (DUMAX, АБС (T_OLD-Т ( K, P))) END IF END DO END DO! $ OMP END DO! $ OMP END PARALLEL! проверить сходимость IF (DUMAX $ OMP DO DO К = 2, N-1 DO Р = 2, N-1, если (MOD (K + P, 2) == 1) THEN T_OLD = Т (К, Р) Т (К, Р) = 0,25 * (Т (К, Р-1) + Т (К, Р + 1) + T (K + 1, Р) + & Т (К-1, Р) -DX ** 2 * S (K, P) ) DUMAX = MAX (DUMAX, АБС (T_OLD-Т (К, Р))) END IF END DO END DO! $ OMP END DO! $ OMP END PARALLEL! проверить сходимость IF (DUMAX $ OMP DO DO К = 2, N-1 DO Р = 2, N-1, если (MOD (K + P, 2) == 1) THEN T_OLD = Т (К, Р) Т (К, Р) = 0,25 * (Т (К, Р-1) + Т (К, Р + 1) + T (K + 1, Р) + & Т (К-1, Р) -DX ** 2 * S (K, P) ) DUMAX = MAX (DUMAX, АБС (T_OLD-Т (К, Р))) END IF END DO END DO! $ OMP END DO! $ OMP END PARALLEL! проверить сходимость IF (DUMAX P))) END IF END DO END DO! $ OMP END DO! $ OMP END PARALLEL! проверить сходимость IF (DUMAX P))) END IF END DO END DO! $ OMP END DO! $ OMP END PARALLEL! проверить сходимость IF (DUMAX
Shiqi He
1

голосов
0

ответ
47

Просмотры

Как иметь сделать сканирование через разные каталоги, чтобы найти и скомпилировать модули перед соединением Fortran исполняемого

Это следование по вопросам 231229, 8855896 и 35234003: У меня есть несколько полезных модулей в ~ / Fortran / включать и я разрабатываю новый код в ~ / Fortran / Projecta. Makefile Моя мечта будет видеть, что A.f90 нуждается mod_MyMod и проверить в ~ / Fortran / включить, чтобы увидеть, если mod_mymod.mod и mod_MyMod.o существовать, если бы не было бы создавать и размещать их в включают, а затем, после связывания объектов из и включает в себя и ProjectA он будет производить в Projecta до сих пор у меня есть это: FC = gfortran ПРОГРАММА = A FCFLAGS = -I ../ включает LDFLAGS = -lm -L / USR / # флаги местных / Библиотеки ForAll (например, искать для системы .mod файлы, необходимые в gfortran) # "сделать" строит все все: $ (ПРОГРАММА) # Использования Fortran МОДУЛЕЙ: Ao: ../include/mod_MyMod.o A: ../include/mod_MyMod.o # Linking%:% .o $ (FC) -o $ @ $ ^ $ (LDFLAGS) # Компиляция (Фортран)% .o:%. f90 $ (FC) $ (FCFLAGS) -c $ <# Подсобные цели чистый: гт -f * .o * .mod в Projecta / У меня есть программа А использование, присущий :: iso_fortran_env, только: R64 => real64, I32 = > int32, & & input_unit, output_unit, error_unit не использовать mod_MyMod неявное нет! глобальный переменный характер (Len = 23) :: строка = "Это говорящий" Print_This вызова (строка) Конец программы A в включает / У меня есть модуль mod_MyMod использование, присущий :: iso_fortran_env, только: R64 => real64, I32 => int32, & & input_unit, output_unit, error_unit неявное никто не содержит подпрограмм Print_This (строка) символ (LEN = 20), цель (в) :: строка записи (output_unit "(* (g0,:,» «))") строка Конец подпрограммы Print_This End Module mod_MyMod для того, чтобы добиться того, чего я хочу, я думаю, что нужны отдельные правила для составления А. f90 и mod_MyMod.f90. В первом случае объект указывает на локальный каталог, во втором .mod и .o должны быть введены в включают.
Clinton Winant
1

голосов
0

ответ
57

Просмотры

Accelerate a file writing routine in Fortran with OpenMP

Я производный типа t_data состоит из трех массивов: Скорость, позиция и типа ускорения :: t_data реальные (вида = REAL64), размещаемая :: скорость (:) реальная (вида = REAL64), размещаемый :: позиции (:) реальной ( вид = REAL64), размещаемый :: ускорение (:) конец типа t_data я выделяю эти массивы и наполнять их информацией. В какой-то момент мне нужно распечатать эту информацию в ASCII формате ВТК и я сделать следующее: открытый ( «» VTK nfil, файл = подрезать (имя_файла) //) запись (nfil „(а)“) „Скорость“ / / "3 "// обрезки (ул (n_particle)) //" двойной" делать J = 1, (n_particle) записи (FILEID, «(ES25.16E3, а, ES25.16E3, а, ES25.16E3, а) «) (данные% скорости (J + (J-1) * 2)), "", (данные% скорости (J + (J-1) * 2 + 1)), "", (данные% скорости (J + (J -1) * 2 + 2)) "" конец сделать записи (nfil, Есть ли способ, которым я мог бы ускорить этот файл письма рутина с OpenMP? Я пытался использовать OpenMP для ускорения DO петли на J, но мне нужно выход заказываются. Поэтому, когда я использовал ЗАКАЗАННЫЙ OpenMP ключевое слово, он компилируется и работает, но у меня нет скорости до вообще, так как все нити выполняют операцию записи в порядке и один на один. Есть ли способ, например использовать три темы и сделать их записать содержимое каждого массива в нужном месте в файле параллельно?
mgsn4Ke
1

голосов
1

ответ
69

Просмотры

Эффективный способ для вычисления функции расстояния

У меня есть 3D-матрица (размер щий, пг, пу), что соответствует физической области. Эта матрица содержит непрерывную область от -1 (этап 1) до +1 (этап 2); интерфейс между двумя фазами является уровень 0 этого поля. Теперь я хочу, чтобы эффективно рассчитать подписанную функцию расстояния от интерфейса для каждой точки в домене. Я попробовал два варианта (SGN является признаком моего поля, со значениями + 1,0, -1, хуг содержит сетку как тройки х, у, г в каждой точке и расстоянием является подписанной функцией расстояния Я хочу, чтобы вычислить) , двойной точности, размер (щ, пг, пу) :: расстояние, SGN, eudist целое :: I, J, K двойной точности :: семя, Постулировать, TMP (NX) делают J = 1, пу сделать к = 1, пг делать = 1, пе семена = SGN (I, K, J)! ищет интерфейса eudist = (хуг (:,:,:, 1) -x (я)) ** 2 + (хуг (:,:,:, 2) -z (к)) ** 2 + (хуг ( :,:,:, 3) -y (к)) ** 2! найти мин в маске постулировать = MINVAL (eudist, семена * sgn.le.0)! TMP помещается в кэш, небольшой скорости до TMP (I) = - семя * dsqrt (постулировать) ENDDO расстояние (:, K, J) = TMP ENDDO ENDDO Я также попробовал второй вариант, который очень похож на один выше, но он вычисляет евклидово расстояние только в подмножестве всей матрицы. С этой второй версией есть некоторая скорость, но это все еще слишком медленно. Я хотел бы знать, есть ли более эффективный способ для вычисления функции расстояния. Второй вариант: двойная точность, размер (ще, пг, пу) :: расстояние, SGN двойная точность, размещаемый, размер (:,:, :) :: eudist целого :: I, J, K, II, JJ, кк целого :: IL, IU, JL, Ju, кл, ку двойной точности :: семян, DeltaX, deltay, deltaz, TMP (щ) DeltaX = макс (интермедиат (пг / 4), 1) deltay = макс (интермедиат (Нью-Йорк / 4), 1) deltaz = макс (интермедиат (пг / 2), 1) выделяют (eudist (2 * DeltaX + 1,2 * deltaz + 1, 2 * deltay + 1)) у = 1, пу ли к = 1, пг сделать я = 1, пх! ищет ближайшую точку в коробке 2 * DeltaX + 1,2 * deltaz + 1,2 * deltay + 1 ил = тах (1, I-DeltaX) IU = мин (щ, г + DeltaX) JL = тах (1, J -deltay) ц = мин (пу, J + deltay) = кл тах (1, к-deltaz) ку = мин (пг, к + deltaz) eudist (:, 1: ку-Ы + 1:) = (хуг (П: IU, Kl: ка, JL: ц, 1) -x (я)) ** 2 & & + (хуг (П: IU, Kl: ка, JL: ж, 2) -z (к)) ** 2 & & + (хуг (П: IU, Kl: ку, JL: ц, 3) -y (к)) ** 2 семени = SGN (I, K, J) TMP (я) = MINVAL (eudist (:, 1: ка-Ы + 1, :), семена * SGN (П: IU, Kl: ка, JL: ц) .le.0) TMP (я) = - семя * dsqrt (TMP (я)) ENDDO расстояние (:, K, J) = TMP ENDDO ENDDO eudist: евклидово расстояние между точкой I, K, J и любой другой точке в коробке 2 * DeltaX + 1,2 * deltaz + 1,2 * deltay + 1 с центром в I, K, J. Это уменьшает вычислительные затраты, как расстояние вычисляется только в подмножестве всей сетки (здесь я предполагаю, что подмножество достаточно большой, чтобы содержать граничную точку). После того, как Владимир предложения (х, у, г являются осями, определяющие положение сетки, хуг (I, K, J) = (X (I), г (к), у (J))): двойная точность, размер (щий, пг, пу) :: расстояние, SGN двойной точности :: х (щ), у (Нью-Йорк), г (пг) двойной точности, размещаемый, размер (:,:, :) :: eudist двойной точности, размещаемый, размер ( :) :: XD, YD, ZD целое :: I, J, K, II, JJ, KK целое :: IL, IU, JL, Ju, кл, ку двойной точности :: семян, DeltaX, deltay, deltaz, TMP (щ) DeltaX = макс (интермедиат (пг / 4), 1) deltay = макс (интермедиат (пу / 4), 1) deltaz = макс (интермедиат (пг / 2), 1) выделяют (eudist (2 * DeltaX + 1,2 * deltaz + 1,2 * deltay + 1)) выделяют (XD (2 * DeltaX + 1)) выделяют (ярд (2 * deltay + 1)) выделяют (ZD (2 * deltaz + 1)) делают J = 1, пу сделать к = 1, пг сделать = 1, пх! ищет ближайшую точку в поле 2 * DeltaX + 1, 2 * deltaz + 1,2 * deltay + 1 ил = тах (1, I-DeltaX) IU = мин (щ, г + DeltaX) JL = тах (1, J-deltay) ц = мин (пу, J + deltay ) = Ы тах (1, к-deltaz) ку = мин (пг, к + deltaz) делают II = 1, IU-иль + 1 XD (II) = (хуг (П + II-1) -x (я) ) ** 2-й конца делает делать JJ = 1, ц-JL + 1 ярд (JJ) = (у (JJ + JL-1) -y (J)) ** 2 конца действительно делать кк = 1, ка-KL + 1 ZD (кк) = (г (кк + KL-1) -z (к)) ** 2-й конец делают делать JJ = 1, ц-JL + 1 делают кк = 1, ку-1 + KL сделать II = 1 , IU-ил + 1 eudist (II, кк, JJ) = XD (II) + ярд (JJ) + ZD (кк) ENDDO ENDDO ENDDO семян = SGN (I, K, J) TMP (я) = MINVAL (eudist (:, 1: ка-Ы + 1, :), семена * SGN (П: IU, Kl: ка, JL: ц) .le.0) TMP (я) = - семя * dsqrt (TMP (я)) ENDDO расстояние (:, K, J) = TMP ENDDO ENDDO EDIT: больше информации о проблеме. Сетка является ортогональной сетки отображается в виде матрицы. Число точек этой сетки составляет порядка 1000 в каждом направлении (в общей сложности около 1000000000 пунктов). Моя цель переход от функции знака (+ 1,0, -1) в знаковой функцию расстояния во всей сетке в эффективном способе.
Giovanni
1

голосов
0

ответ
34

Просмотры

OMP variable reduction inside subroutine called in the OMP block

Я переменной, на которую указывает этот указатель в одном из моих подпрограмм: комплекс (Dp), указатель :: ПКС (:,:) => NULL () Я также передать его в том же рутина: вызов MIO_Allocate (PKC, [1 1,1], [ptsTot, Nat, 2], 'ПКС', 'диаг') внутри этой процедуры, я использую его внутри области ОМП: $ OMP PARALLEL DO PRIVATE (ПЭО, т.е. unfoldedK), снижение ( +: Ake1, Ake2, Аке), & $ OMP & ШАРЕД (PKC, KptsG, E, КЦП, AkeGaussian1, AkeGaussian2, AkeGaussian, Nat, nspin, есть UCell, gcell, H0, maxNeigh, Хопп, NLIST, Nneigh, neighCell , гауссовый, EPTS) сделать ик = 1, ptsTot! К петле ... называть DiagSpectralWeightWeiKuInequivalentInequivalent (Nat, nspin, есть, PKC (ик,:, :), Е (:, есть), ККЗ (:, ик), unfoldedK (:), UCell, gcell, Н0, maxNeigh, Хопп, NLIST, Nneigh, neighCell) ... конец делаем! $ OMP END PARALLEL DO, где новая процедура, которая называется задается subroutineDiagSpectralWeightWeiKu (N, нс, это, PkcLoc, Е, К, КГ, клетка, H0, maxN, Хопп, N Список, Nneigh, neighCell) ... комплекс (дп), намерение (уходит) :: PkcLoc (N, 2) ... делать J = 1, N! Они являются собственными векторами с индексом группы J делать в = 1, N PkcLoc (J, 1) = PkcLoc (к, 1) + ехр (-cmplx_i * dot_product (КГ, RtsVec (в, :))) * Hts (в, к) конец этого конца сделать ... конец подпрограммы DiagSpectralWeightWeiKuInequivalent Как я могу убедиться, что PkcLoc получает надлежащее поведение при выполнении OMP? Я получаю ошибку сегментации, которые я предполагаю, что связаны с отсутствующим СОКРАЩЕНИЕМ на PkcLoc. Любые советы о том, как решить эту проблему? Я нашел эту нить, но она отличается в том смысле, что в моем случае сделать цикл находится вне подпрограммы, что называется. 1) + ехр (-cmplx_i * dot_product (KG, RtsVec (в, :))) * Hts (в, J) конца сделать конец сделать ... конец подпрограммы DiagSpectralWeightWeiKuInequivalent Как я могу убедиться, что PkcLoc получает надлежащее поведение при выполнении OMP? Я получаю ошибку сегментации, которые я предполагаю, что связаны с отсутствующим СОКРАЩЕНИЕМ на PkcLoc. Любые советы о том, как решить эту проблему? Я нашел эту нить, но она отличается в том смысле, что в моем случае сделать цикл находится вне подпрограммы, что называется. 1) + ехр (-cmplx_i * dot_product (KG, RtsVec (в, :))) * Hts (в, J) конца сделать конец сделать ... конец подпрограммы DiagSpectralWeightWeiKuInequivalent Как я могу убедиться, что PkcLoc получает надлежащее поведение при выполнении OMP? Я получаю ошибку сегментации, которые я предполагаю, что связаны с отсутствующим СОКРАЩЕНИЕМ на PkcLoc. Любые советы о том, как решить эту проблему? Я нашел эту нить, но она отличается в том смысле, что в моем случае сделать цикл находится вне подпрограммы, что называется.
Nigu
1

голосов
1

ответ
74

Просмотры

C программа MPI вызова фортрановских рутинные аварий

Я успешно запрограммировал умножение матрицы на матрицу на одном узле, и теперь моя цель состоит в том, чтобы связать эту программу, чтобы выполнить параллельно на кластерах узлов. Основная работа изменяет код из исходного кода ScaLAPACK Netlib с изменением исходного кода (из ScaLAPACK) с частью рассчитайте матрицы умножения матриц (в этом случае dgemm_) по моей программе (mydgemm). Здесь, исходный код программы C, но все рутина в этой программе вызова Fortran подпрограммы (например, dgemm_ является язык Фортран), и моя программа (mydgemm) является программа C. После того, как я изменить, можно выполнить успешно с одного узла с любым размером матрицы, но при запуске с 4-мя узлами (с размером матрицы больше, чем 200) -> Он имеет ошибку о данных связи между узлом (MPI) , Это ошибка: * BAD ОКОНЧАНИЕ ОДНОГО ИЗ ВАШЕГО ПРИМЕНЕНИЯ ПРОЦЕССЫ PID 69754 RUNNING НА localhost.localdomain ВЫХОД КОД: 11 ЧИСТКИ UP СОХРАНЯЮЩИЕ ПРОЦЕССЫ вы можете игнорировать НИЖЕ Cleanup СООБЩЕНИЙ * Я просто использовать MPI в основной функции, чтобы создать матрицу случайного в каждом узле (прикрепление следующие ) - с обычной называется new_pdgemm (...). (Я изменил код внутри нового-pdgemm). Внутри mydgemm.c я использую OMP, чтобы параллельно и этот код выполняется на ядре. Может дать мне руководство или идею, чтобы решить мою проблему? Как вы думаете, что проблема, потому что Fortran является столбец основным, но C является ряд основных? Или мне нужно изменить mydgemm.c по mydgemm.f (это очень трудно, и, возможно, я не могу это сделать)? Мой код: INT основной (интермедиат ARGC, символ ** ARGV) {Int I, J, K; / ************ MPI *************************** / INT myrank_mpi, nprocs_mpi; MPI_Init (& ARGC, & ARGV); MPI_Comm_rank (MPI_COMM_WORLD, & myrank_mpi); MPI_Comm_size (MPI_COMM_WORLD, & nprocs_mpi); / ************ BLACS *************************** / INT ictxt, nprow, npcol, myrow , Mycol, NB; ИНТ Информация, itemp; INT _ZERO = 0, _ONE = 1; INT М = 20000; INT К = 20000; Int N = 20000; nprow = 2; npcol = 2; NB = 1200; Cblacs_pinfo (& myrank_mpi, & nprocs_mpi); Cblacs_get (-1, 0, & ictxt); Cblacs_gridinit (& ictxt, "строка", nprow, npcol); Cblacs_gridinfo (ictxt, & nprow, & npcol, & myrow, & Mycol); // Е ( "myrank =% d \ п", myrank_mpi); INT = гА numroc_ (& М, & NB, & myrow, & _ZERO, & nprow); INT = сА numroc_ (& К, & NB, & Mycol, & _ZERO, & npcol); INT гв = numroc_ (& К, & NB, & myrow, & _ZERO, & nprow); INT сВ = numroc_ (& N, & NB, & Mycol, & _ZERO, & npcol); INT гс = numroc_ (& М, & NB, & myrow, & _ZERO, & nprow); INT сС = numroc_ (& N, & NB, & Mycol, & _ZERO, & npcol); двойной * А = (двойной *) таНос (гА * сА * SizeOf (двойной)); двойной * В = (двойной *) таНос (гв * сВ * SizeOf (двойной)); двойной * С = (двойной *) таНос (Rc * сС * SizeOf (двойной)); INT DESCA [9], descB [9], descC [9]; descinit_ (DESCA, & М, & К, & NB, & NB, & _ZERO, & _ZERO, & ictxt, & гА, и данные); descinit_ (descB, & К, & N, & NB, & NB, & _ZERO, & _ZERO, & ictxt, & гв, & данные); descinit_ (descC, & М, & N, & NB, & NB, & _ZERO, & _ZERO, & ictxt, & Rc, & данные); двойной альфа = 1,0; двойной бета = 1,0; двойной старт, конец, плюхается; srand (время (NULL) * myrow + Mycol); #pragma SIMD для (J = 0, J
1

голосов
1

ответ
1.5k

Просмотры

BLAS подпрограммы DGEMM, dgemv и ddot не работает с скаляры?

У меня есть Fortran подпрограмма, которая использует подпрограмму Блас»DGEMM, dgemv и ddot, которые вычисляют матрицу * матрицу, матрица * вектор и вектор * вектор. У меня есть м * м матрицы и м * 1 векторов. В некоторых случаях т = 1. Кажется, что эти подпрограммы не работают в тех случаях. Они не дают ошибки, но, как представляется, некоторая численная нестабильность в результатах. Так что я должен написать что-то вроде: если (т> 1), то vtuni (я, т) = уг (я, т) - а (я, т) - ddot (м, ZT (I, 1: м, (т -1) * Твар (3) +1), 1, AREC, 1) остальное vtuni (я, т) = уг (я, т) - а (я, т) - ZT (я, 1, (т-1 ) * Тварь (3) +1) * AREC (1) Так мой фактический вопрос, я прав, что подпрограммы тех, Блас»не работает должным образом, когда т = 1 или есть просто что-то не так в моем коде? Может ли компилятор повлиять на это? Я использую gfortran.
1

голосов
1

ответ
3.1k

Просмотры

Visual Studio, Intel Visual Fortran и C / C ++ смешанного языка компиляции Визуальное

Работа с Visual Studio 2008 Pro с Intel Fortran компилятора v11, на Windows 7 x64. У меня есть проект Visual Fortran Intel набор со всеми Фортран исходных файлов. Я хочу, чтобы постепенно заменить все эти подпрограммы с C / C ++ (на самом деле CUDA - бонусные баллы). Просто щелкнув правой кнопкой мыши на исходных файлов в обозревателе решений и «Добавить существующий элемент» поставит .cpp или .c или Cuda файл в списке ... но он никогда не будет скомпилирован. Таким образом, любой интерфейс для кода C написано в Фортране код всегда терпит неудачу на этапе компоновки. Как же можно получить смешанный язык проект, как это? Google не удалось мне, и все, что я найти это описание фактического кода интерфейса, без каких-либо инструкций о том, как осуществить визуальную систему студии сборки. Заранее спасибо.
Aurelius
1

голосов
4

ответ
3.4k

Просмотры

Fortran - problem with double precision

У меня есть небольшая программа, читать некоторые данные из двоичного файла и сохраняет его в нормальные (неформатированные) файлы. Здесь не является источником: Программа calki2e НЕЯВНЫЕ NONE! Двойная точность VAL ЦЕЛОЕ Р, Q, R, S INTEGER IREC2C ПАРАМЕТР (IREC2C = 15000) целочисленный и, RShift, ЗАГОЛОВОК, IMBABS, NX, IB, NFT77 ЦЕЛОГО ИНД ИЗМЕРЕНИЕ IND (IREC2C) двойная точность XP ИЗМЕРЕНИЕ XP (IREC2C) СИМВОЛЫ ( LEN = 12) :: FN77 = 'input08' ПРОДОЛЖИТЬ NFT77 = 77! ---------------------------------- ------------------------------------ 2 ПРОДОЛЖИТЬ С открытым (единица = NFT77, файл = FN77, STATUS = 'OLD', + ACCESS = 'SEQUENTIAL', FORM = 'UNFORMATTED') открыто (единица = 13, файл = 'calki2e.txt') ОБРАТНЫЙ (77) 4100 продолжить READ (77) NX, IND, XP IMBABS = IABS (NX) DO 100 IB = 1, IMBABS ЗАГОЛОВОК = IND (IB), Р = И (RShift (ЗАГОЛОВОК, 24), 255) Q = И (RShift (ЗАГОЛОВОК, 16), 255) Р = И (RShift (ЗАГОЛОВОК, 8), 255) S = И ( ЗАГОЛОВОК, 255) VAL = XP (Iб) ЕСЛИ (P.EQ. Q) = VAL VAL VAL + ЕСЛИ (R .EQ. S) VAL = VAL VAL + ЕСЛИ ((Р .EQ. R) .AND. (Q .EQ. S)) = VAL VAL VAL + записи (13, *) Р, Q, R, S, вал 100 ПРОДОЛЖИТЬ ЕСЛИ (NX.GT.0) GOTO 4100 ЦРБ ЗАКРЫТЬ (ЕДИНИЦА = NFT77)! END Когда я скомпилировать его с помощью gfortran я получить двойную точность в выходном файле, но с g77 я получаю только одинарную точность. Что это не так, и как изменить его? 255) VAL = XP (Iб) ЕСЛИ (P.EQ. Q) = VAL VAL VAL + ЕСЛИ (R .EQ. S) VAL = VAL VAL + ЕСЛИ ((Р .EQ. R) .AND. (Q .EQ . S)) = VAL VAL VAL + записи (13, *) Р, Q, R, S, вал 100 ПРОДОЛЖИТЬ ЕСЛИ (NX.GT.0) GOTO 4100 ЦРБ ЗАКРЫТЬ (ЕДИНИЦА = NFT77)! END Когда я скомпилировать его с помощью gfortran я получить двойную точность в выходном файле, но с g77 я получаю только одинарную точность. Что это не так, и как изменить его? 255) VAL = XP (Iб) ЕСЛИ (P.EQ. Q) = VAL VAL VAL + ЕСЛИ (R .EQ. S) VAL = VAL VAL + ЕСЛИ ((Р .EQ. R) .AND. (Q .EQ . S)) = VAL VAL VAL + записи (13, *) Р, Q, R, S, вал 100 ПРОДОЛЖИТЬ ЕСЛИ (NX.GT.0) GOTO 4100 ЦРБ ЗАКРЫТЬ (ЕДИНИЦА = NFT77)! END Когда я скомпилировать его с помощью gfortran я получить двойную точность в выходном файле, но с g77 я получаю только одинарную точность. Что это не так, и как изменить его? END Когда я скомпилировать его с помощью gfortran я получить двойную точность в выходном файле, но с g77 я получаю только одинарную точность. Что это не так, и как изменить его? END Когда я скомпилировать его с помощью gfortran я получить двойную точность в выходном файле, но с g77 я получаю только одинарную точность. Что это не так, и как изменить его?
Michał
1

голосов
2

ответ
141

Просмотры

Получать уведомления о событии Broad-отлиты из Fortran в управляемом коде

У меня есть Fortran (неуправляемый код) DLL в качестве расчета двигателя, и C # форму в качестве графического интерфейса пользователя. Теперь, расчет в фортране долго, так, чтобы не утомлять пользователь, я решил использовать команду асинхронной, чтобы создать индикатор прогресса. Длл Фортран будет нести ответственность за создание сообщений в строке прогресса, как расчет доходов. Любая идея, как это можно сделать?
Graviton
1

голосов
1

ответ
238

Просмотры

Разница в Fortran и C хранения массива?

Я хочу, чтобы вычислить разложение Qr с помощью функции F77_NAME (dgeqrf) из LaPack Lib в программе переменного тока. Для матрицы 3х3: 12,000000 -51,000000 4,000000 6,000000 167,000000 -68,000000 24,000000 -4,000000 -41.000000 я получаю выходной 3x3 (сочетание матрицы R и некоторые векторы, используемые для построения Q) (линейная форма): -52.545219, -0.790144, 0.061972, 165.895209, -70,906839, -0,520684, 27,328842, -31,566433, -23,015097 Я использую затем F77_NAME (dorgqr) из Lapack для извлечения матрицы Q, получить на выходе 3x3 (линейная форма): -0.228375, 0.970593, -0.076125, -0.618929, - 0.084383, 0.780901, 0.751513, 0.225454, 0.619999 Это пример взят из википедии и кажется, что мой Q отличается от википедии Q: HTTP: //en.wikipedia. орг / вики / QR_decomposition # Example_2 Может разница между FORtran и С представлением массива быть причиной? Будет ли транспонирование на исходной матрице решить эту проблему?
cfort
1

голосов
1

ответ
2k

Просмотры

Fortran 90/95 OpenMP reduction with an array (sum)

Я работаю на добавление некоторых директив OpenMP для большого набора довольно дорогих вложенных циклов. Я считаю, что нужно использовать условие сокращения с моей директивой, поскольку операции на массиве на не обязательно независимы. Тем не менее, при попытке добавить директиву сокращения мое ядро ​​приложения дамп (но компилируется). Я использую XL Fortran компилятор IBM позволила с OpenMP 3.0. Мой (упрощенный) код ниже: $ OMP параллельно делать восстановление (+: е)! Частное (п, т, л, I, J, K, & $ OMP PARM, ISTA, iend, jsta, jend, кста, Kend ) делают п = 1, лм! K сделать т = 1, JM! J делают л = 1, им! я, если (Val (л, м, п) .Не. ноль), то jsta = макс J оценки в коробке jend = мин J оценки в окне ISTA = тах оценки в поле iend = мин I оценки в коробке кста = мин K пределы в коробке Kend = макс K оценки в поле у ​​к = кста, Kend сделать J = jsta, jend сделать я = ISTA, iend PARM = ехр (-dx * (абс (IL)) & -ды * (абс (JM)) & -dz * (абс (Kn))) F (I, J, K) = F (I, J, K) + Val (л, м, п) * конец PARM сделать конец сделать конец, если в конечном конец сделать конец сделать конец делаем Где F имеет размерность (IM, JM, лм). Является ли это просто вопрос синтаксиса? Я пытался это на несколько проблем меньше, игрушка, но у меня возникают проблемы с получением того, что я учусь с меньшим испытанием для применения в данном контексте. Для справочных целей я задавал подобный вопрос несколько месяцев назад, но проблема немного изменилась с тех пор, и я не считаю, что решение так просто сейчас (ссылка). Спасибо за любую помощь / комментарий! -dz * (абс (Kn))) F (I, J, K) = F (I, J, K) + Val (л, м, п) * конец PARM сделать конец сделать конец, если в конечном конец сделать конец сделать конец сделать где F имеет размерность (им, JM, лм). Является ли это просто вопрос синтаксиса? Я пытался это на несколько проблем меньше, игрушка, но у меня возникают проблемы с получением того, что я учусь с меньшим испытанием для применения в данном контексте. Для справочных целей я задавал подобный вопрос несколько месяцев назад, но проблема немного изменилась с тех пор, и я не считаю, что решение так просто сейчас (ссылка). Спасибо за любую помощь / комментарий! -dz * (абс (Kn))) F (I, J, K) = F (I, J, K) + Val (л, м, п) * конец PARM сделать конец сделать конец, если в конечном конец сделать конец сделать конец сделать где F имеет размерность (им, JM, лм). Является ли это просто вопрос синтаксиса? Я пытался это на несколько проблем меньше, игрушка, но у меня возникают проблемы с получением того, что я учусь с меньшим испытанием для применения в данном контексте. Для справочных целей я задавал подобный вопрос несколько месяцев назад, но проблема немного изменилась с тех пор, и я не считаю, что решение так просто сейчас (ссылка). Спасибо за любую помощь / комментарий! Ве пытались это на несколько проблем меньше, игрушка, но у меня возникают проблемы с получением того, что я учусь с меньшим испытанием для применения в данном контексте. Для справочных целей я задавал подобный вопрос несколько месяцев назад, но проблема немного изменилась с тех пор, и я не считаю, что решение так просто сейчас (ссылка). Спасибо за любую помощь / комментарий! Ве пытались это на несколько проблем меньше, игрушка, но у меня возникают проблемы с получением того, что я учусь с меньшим испытанием для применения в данном контексте. Для справочных целей я задавал подобный вопрос несколько месяцев назад, но проблема немного изменилась с тех пор, и я не считаю, что решение так просто сейчас (ссылка). Спасибо за любую помощь / комментарий!
JRC
1

голосов
2

ответ
7.9k

Просмотры

Компиляция файлов с помощью Notepad ++ и Intel Fortran Compiler

Я новичок, используя Notepad ++, но я программирование с Fortran Intel Compiler. Я хотел бы, чтобы компилировать и запускать мой Fortran сценария использования, непосредственно, Notepad ++. Может кто-нибудь помочь мне, чтобы сказать мне, что мне нужно сделать для того, чтобы настроить Notepad ++ для компиляции в Fortran? Я знаю, что я могу скомпилировать некоторые программы, если у меня есть в Notepad ++ плагин в NppExec, что у меня есть. С уважением.
Luke Solo
1

голосов
1

ответ
161

Просмотры

Mixed-код - Указатели на функции-члены

Я хотел бы назвать FORTRAN функции из моего кода C ++. Функция FORTRAN что-то вроде этого экстерном "C" {недействительным FORTRANFUNC (аннулируются СКЛС (интермедиат *, двойной *), Int * N); } Функция СКЛС отмечалось выше, является функцией членом класса C ++ класса CppClass {... аннулируются СКЛС (интермедиат * а, двойной * б); ...}; Я хотел бы назвать код таким образом, но мне кажется, что это не представляется возможным: FORTRANFUNC (myClass.FCN, & П-); Компилятор жалуется, потому что FORTRAN функция хочет аннулировать функцию FCN, пока я пропускание CppClass :: аннулируется функция. Вы можете мне помочь?
alberto.cuoci
1

голосов
1

ответ
143

Просмотры

MPI_RECV со списком источников

Можно ли получить список источников, переданных в MPI_Recv (или эквивалент) позвонить? В настоящее время мой код выглядит примерно так: сделать я = Nod1, NOD2 вызов MPI_RECV (TMP, п, MPI_REAL, MPI_ANY_SOURCE, тег, MPI_COMM_WORLD, статус, IERR) ... делать вещи ТМП здесь называют MPI_Send (TMP, п, MPI_REAL, статус (MPI_SOURCE), тег, MPI_COMM_WORLD, IERR) ENDDO конечно, это не гарантирует, что он делает то, что я хочу. (Если Nod1 посылает два сообщения здесь до NOD2 может послать одно сообщение, то сообщение NOD2 является не получил во время этой итерации, что было бы плохо.) В моем заявлении, что не может произойти, так как Nod1 и NOD2 имеют другие ограничения, которые заставляют их быть синхронизированы (достаточно) друг с другом ... но у меня интересно, если есть способ указать список проки, которым разрешено быть получили от.
mgilson
1

голосов
1

ответ
122

Просмотры

Методы обработки массивов хранения, чьи требования превышают RAM

Я автор научного приложения, которое выполняет расчеты на основе (с координатной привязкой думает сетка вычисления конечных разностей). Каждая ячейка сетки представляет объект данных, который содержит значение переменных состояния и клеточные специфические константы. До сих пор все объекты ячейки сетки не присутствует в оперативной памяти в течение всего времени моделирования. Я бегу в ситуации, когда люди, использующие свой код, хотят, чтобы запустить его с большим количеством ячеек сетки, чем они имеют доступную оперативную память. Я имею в виду переработав свой код так, чтобы информация о только подмножество клеток проводится в оперативной памяти в любой момент времени. К сожалению, сетки (или матрицы, если вы предпочитаете), не редки, что исключает целый класс возможных решений. Вопрос: Я предполагаю, что есть библиотеки в дикой природе, предназначенной для облегчения этого вида доступа к данным (т.е. получить константы и переменные, обновление переменных, хранилище для дальнейшего использования, затирочные память, двигаться дальше ...) После нескольких часов поиска Google и переполнения стека, я нашел сравнительно мало библиотек такого рода. Я знаю несколько вариантов, таких, как этот из математической библиотеки HSL: http://www.hsl.rl.ac.uk/specs/hsl_of01.pdf. Я предпочитаю работать с чем-то, что является открытым исходным кодом и записывается в Fortran или C. (мой код в основном Fortran 95/2003, с небольшим количеством C и Python, добавленным для хорошей меры!) Я бы признателен за любые предложения относительно доступные библиотеки или советы о том, как сформулировать свою проблему. Спасибо! такие, как эта из математической библиотеки HSL: http://www.hsl.rl.ac.uk/specs/hsl_of01.pdf. Я предпочитаю работать с чем-то, что является открытым исходным кодом и записывается в Fortran или C. (мой код в основном Fortran 95/2003, с небольшим количеством C и Python, добавленным для хорошей меры!) Я бы признателен за любые предложения относительно доступные библиотеки или советы о том, как сформулировать свою проблему. Спасибо! такие, как эта из математической библиотеки HSL: http://www.hsl.rl.ac.uk/specs/hsl_of01.pdf. Я предпочитаю работать с чем-то, что является открытым исходным кодом и записывается в Fortran или C. (мой код в основном Fortran 95/2003, с небольшим количеством C и Python, добавленным для хорошей меры!) Я бы признателен за любые предложения относительно доступные библиотеки или советы о том, как сформулировать свою проблему. Спасибо!
westie314
1

голосов
2

ответ
1.5k

Просмотры

Модули и типа связаны процедуры

Я получаю следующее сообщение об ошибке: Имя процедуры модуля конфликтует с именем в блоке всеохватывающим обзорного. [ADD_SUB] при компиляции исходного кода ниже с ifort 12.0.3 на битной платформе Ubuntu 12,04 64. Есть идеи? Модуль Header Type :: здравствуйте Integer :: целочисленного :: б Integer :: сумма содержит процедуру, передать :: добавить => add_sub типа End привет интерфейс подпрограммы add_sub (это) Импорт привет неявной None класс (привет) :: Конец этой подпрограммы add_sub End Interface End Module Модуль подпрограммы использовать заголовок содержит подпрограмм add_sub (это) неявной None класс (привет), намерение (Inout) :: это эта сумма% = это% а + это% б Конец модуля Конец подпрограммы Test Program использовать Header использование подпрограммы Неявные нет Тип (привет) ::
user1407220
1

голосов
1

ответ
2.6k

Просмотры

Странное поведение с использованием COS () и SIN () в Fortran 77

Я получаю какое-то странное поведение, используя COS () и SIN () библиотеки в Fortran 77. улавливает, что число выполнить это операция на как здесь: DATA V, THETA, PI / 100, 45, 3,1416 / THETA = THETA * PI / 180,0 ПЕЧАТЬ *, "ТЕТА =", ТЕТА VX = V * COS (ТЭТА) В.Я. = V * SIN (ТЭТА) ПЕЧАТЬ *, Vx, Vy КОНЕЦ, когда я проверить это, я считаю, что COS (Theta) = COS (45 ) не COS (0.7853) и то же самое относится к SIN () тоже. Так почему же это происходит? Это мой результат: THETA = 0.785400 70.7105 70.7108
Rafael Adel
1

голосов
5

ответ
243

Просмотры

changing variables in a Fortran input file using C++

I was hoping someone could give me advice as to easily change the value of various variables within a Fortran input file from a C++ application. I have a model written in Fortran but am writing a C++ application to execute the model in a loop but changing the value of the model parameters after each model execution. Any advice would be appreciated. Thanks! .Pnd file Subbasin: 1 7/26/2012 12:00:00 AM ArcSWAT 2009.93.7 Pond inputs: 0.000 | PND_FR : Fraction of subbasin area that drains into ponds. The value for PND_FR should be between 0.0 and 1.0. If PND_FR = 1.0, the pond is at the outlet of the subbasin on the main channel 0.000 | PND_PSA: Surface area of ponds when filled to principal spillway [ha] 0.000 | PND_PVOL: Volume of water stored in ponds when filled to the principal spillway [104 m3] 0.000 | PND_ESA: Surface area of ponds when filled to emergency spillway [ha] 0.000 | PND_EVOL: Volume of water stored in ponds when filled to the emergency spillway [104 m3] 0.000 | PND_VOL: Initial volume of water in ponds [104 m3] 0.000 | PND_SED: Initial sediment concentration in pond water [mg/l] 0.000 | PND_NSED: Normal sediment concentration in pond water [mg/l] 0.000 | PND_K: Hydraulic conductivity through bottom of ponds [mm/hr]. 0 | IFLOD1: Beginning month of non-flood season 0 | IFLOD2: Ending month of non-flood season 0.000 | NDTARG: Number of days needed to reach target storage from current pond storage 10.000 | PSETLP1: Phosphorus settling rate in pond for months IPND1 through IPND2 [m/year] 10.000 | PSETLP2: Phosphorus settling rate in pond for months other than IPND1-IPND2 [m/year] 5.500 | NSETLP1: Initial dissolved oxygen concentration in the reach [mg O2/l] 5.500 | NSETLP2: Initial dissolved oxygen concentration in the reach [mg O2/l] 1.000 | CHLAP: Chlorophyll a production coefficient for ponds [ ] 1.000 | SECCIP: Water clarity coefficient for ponds [m] 0.000 | PND_NO3: Initial concentration of NO3-N in pond [mg N/l] 0.000 | PND_SOLP: Initial concentration of soluble P in pond [mg P/L] 0.000 | PND_ORGN: Initial concentration of organic N in pond [mg N/l] 0.000 | PND_ORGP: Initial concentration of organic P in pond [mg P/l] 5.000 | PND_D50: Median particle diameter of sediment [um] 1 | IPND1: Beginning month of mid-year nutrient settling "season" 1 | IPND2: Ending month of mid-year nutrient settling "season" Wetland inputs: 0.000 | WET_FR : Fraction of subbasin area that drains into wetlands 0.000 | WET_NSA: Surface area of wetlands at normal water level [ha] 0.000 | WET_NVOL: Volume of water stored in wetlands when filled to normal water level [104 m3] 0.000 | WET_MXSA: Surface area of wetlands at maximum water level [ha] 0.000 | WET_MXVOL: Volume of water stored in wetlands when filled to maximum water level [104 m3] 0.000 | WET_VOL: Initial volume of water in wetlands [104 m3] 0.000 | WET_SED: Initial sediment concentration in wetland water [mg/l] 0.000 | WET_NSED: Normal sediment concentration in wetland water [mg/l] 0.000 | WET_K: Hydraulic conductivity of bottom of wetlands [mm/hr] 0.000 | PSETLW1: Phosphorus settling rate in wetland for months IPND1 through IPND2 [m/year] 0.000 | PSETLW2: Phosphorus settling rate in wetlands for months other than IPND1-IPND2 [m/year] 0.000 | NSETLW1: Nitrogen settling rate in wetlands for months IPND1 through IPND2 [m/year] 0.000 | NSETLW2: Nitrogen settling rate in wetlands for months other than IPND1-IPND2 [m/year] 0.000 | CHLAW: Chlorophyll a production coefficient for wetlands [ ] 0.000 | SECCIW: Water clarity coefficient for wetlands [m] 0.000 | WET_NO3: Initial concentration of NO3-N in wetland [mg N/l] 0.000 | WET_SOLP: Initial concentration of soluble P in wetland [mg P/l] 0.000 | WET_ORGN: Initial concentration of organic N in wetland [mg N/l] 0.000 | WET_ORGP: Initial concentration of organic P in wetland [mg P/l] 0.000 | PNDEVCOEFF: Actual pond evaporation is equal to the potential evaporation times the pond evaporation coefficient 0.000 | WETEVCOEFF: Actual wetland evaporation is equal to the potential evaporation times the wetland evaporation coefficient.
gcolumbus
1

голосов
1

ответ
314

Просмотры

Добавление стандартного пути для поиска файлов .o gfortran

Для решения некоторых интегралов я скачал Quadpack для Fortran и скомпилирован все исходные файлы, чтобы объектные файлы. Теперь, когда я хочу, чтобы вызывать подпрограммы из Quadpack мне нужно, чтобы связать их вручную или с помощью Makefile / скрипт, и это работает прекрасно. Однако, так как я использую несколько подпрограмм из Quadpack и для целого ряда различных программ, которые он сделает мою жизнь намного проще, если бы я мог получить gfortran автоматически искать .o файлы. Скажем, у меня есть каталог, где все .o файлы, содержащийся Я хотел бы добавить, что в качестве стандартного пути для gfortran, чтобы искать объектные файлы. Так что я могу вызвать подпрограмму в моей программе и просто скомпилировать его, не узнать ведьму .o файлы мне нужно и связать их вручную. Я понимаю, что -l флаг будет решить эту проблему, но я хочу знать, если есть простой / ленивый способ сделать это. Я думал, может быть, я могу сделать некоторые изменения в компилятор и переделать его, но это не совсем то, что я хочу, чтобы начать возиться с. Я использую Ubuntu, кстати. Надеюсь, что вы, ребята поняли мою проблему, и что есть простое решение. PS: Это то, как я это сделать сейчас, чтобы вызвать одну процедуру. #! / Bin / ш gfortran -c int.f95 gfortran -o INT int.o qagie.o qelg.o qk15i.o qpsrt.o r1mach.o xermsg.o j4save.o xerprn.o xersve.o xerhlt.o xercnt .o fdump.o xgetua.o i1mach.o ./int Как вы можете видеть, это просто простой скрипт для компиляции и запуска int.f95
HaakonA
1

голосов
1

ответ
302

Просмотры

не можешь использовать солнечные часы-Kinsol в FORTRAN подпрограммы?

Спасибо за то, что взгляд на эту проблему. Проблема: сегментная. неисправность при возвращении из F90 подпрограммы, которая содержит процесс решения Kinsol, после того, как правильный результат вычисления сгенерирован. Нет проблем, когда тот же процесс решения не в основной программе. Окружающая среда: Linux, GCC, солнечные часы статического ЛИЭСА как инициировать задачу: получить прилагаемое ПОНИЖЕНЫ тестовый код модуля moduleNonlinearSolve целого, за исключением :: NEQ содержит подпрограмму solveNonlinear (и) с двойной точностью :: и (*) целым Iout (15), ИМ двойная точность маршрут (2), koefScal (NEQ) koefScal (:) = 1D0 fnvinits вызова (3, Neq, ИОС) вызов fkinmalloc (Iout, маршрут, ИОС) вызов fkinspgmr (50,10, ИОС) вызов fkinsol (и, 1 , koefScal, koefScal, ИОС) называть fkinfree () делать = 1, NEQ записи (*, *), г, и (я) конец сделать конец подпрограммы концевой модуль подпрограммы fkfun (и, fval, IER) использовать moduleNonlinearSolve двойной точности :: и (*) с двойной точностью :: fval (*) целое число :: IER FORALL (я = 2: NEQ-1) fval (я) = - и (I-1) + 2d0 * U (я) -u (I + 1) -1d0 конец FORALL fval (1) = и (1) + 2d0 * и (1) -u (2) -1d0 fval (NEQ) = - и (NEQ-1) + 2d0 * и (NEQ) + и (NEQ) -1d0 IER = 0 конечное использование тест подпрограммы программы moduleNonLinearSolve двойной точности и (10) NEQ = размер (и) и (:) = 10d0 называть solveNonlinear (и) конец program`` компиляции $ gfortran -c -g -Wall test.f90 $ gfortran -Wall -g -o тест test.o -lsundials_fkinsol -lsundials_fnvecserial -lsundials_kinsol -lsundials_nvecserial -llapack -lblas запустить $ ./test Примечание: Это будет работать безупречно, если поместить все процедуры в солнечных часах основной программы. Большое спасибо за любой вклад. Mianzhi Neq-1) fval (я) = - и (I-1) + 2d0 * и (я) -u (I + 1) -1d0 конец FORALL fval (1) = и (1) + 2d0 * и (1) -u (2) -1d0 fval (NEQ) = - и (NEQ-1) + 2d0 * и (NEQ) + и (NEQ) -1d0 IER = 0 конечное использование тест подпрограммы программы moduleNonLinearSolve двойной точности и (10) NEQ = размер (и) и (:) = 10d0 называют solveNonlinear (и) конец program`` составить $ gfortran -c -g -Wall test.f90 $ gfortran -Wall -g -o тест test.o -lsundials_fkinsol -lsundials_fnvecserial -lsundials_kinsol - lsundials_nvecserial -llapack -lblas запустить $ ./test Примечание: Это будет работать безупречно, если поместить все процедуры в солнечных часов основной программы. Большое спасибо за любой вклад. Mianzhi Neq-1) fval (я) = - и (I-1) + 2d0 * и (я) -u (I + 1) -1d0 конец FORALL fval (1) = и (1) + 2d0 * и (1) -u (2) -1d0 fval (NEQ) = - и (NEQ-1) + 2d0 * и (NEQ) + и (NEQ) -1d0 IER = 0 конечное использование тест подпрограммы программы moduleNonLinearSolve двойной точности и (10) NEQ = размер (и) и (:) = 10d0 называют solveNonlinear (и) конец program`` составить $ gfortran -c -g -Wall test.f90 $ gfortran -Wall -g -o тест test.o -lsundials_fkinsol -lsundials_fnvecserial -lsundials_kinsol - lsundials_nvecserial -llapack -lblas запустить $ ./test Примечание: Это будет работать безупречно, если поместить все процедуры в солнечных часов основной программы. Большое спасибо за любой вклад. Mianzhi ) = 10d0 называют solveNonlinear (и) конец program`` компилировать $ gfortran -c -g -Wall test.f90 $ gfortran -Wall -g -o тест test.o -lsundials_fkinsol -lsundials_fnvecserial -lsundials_kinsol -lsundials_nvecserial -llapack -lblas запустить $ ./test Примечание: Это будет работать безупречно, если поместить все процедуры в солнечных часов основной программы. Большое спасибо за любой вклад. Mianzhi ) = 10d0 называют solveNonlinear (и) конец program`` компилировать $ gfortran -c -g -Wall test.f90 $ gfortran -Wall -g -o тест test.o -lsundials_fkinsol -lsundials_fnvecserial -lsundials_kinsol -lsundials_nvecserial -llapack -lblas запустить $ ./test Примечание: Это будет работать безупречно, если поместить все процедуры в солнечных часов основной программы. Большое спасибо за любой вклад. Mianzhi
mianzhi
1

голосов
2

ответ
2.2k

Просмотры

Не удается скомпилировать МАГМА 1.3 на Ubuntu 10.04, CUDA 5.0

Я пытаюсь скомпилировать библиотеки магмы на Ubuntu 10.04, и я застрял. Из файла README: Для установки МАГМА, измените файл make.inc, чтобы указать, где CUDA, CPU BLAS и LAPACK установлены на вашей системе. Примеры приведены в make.inc.mkl, make.inc.acml, make.inc.goto и make.inc.atlas, показывающий, как соединить соответственно с MKL, ACML, GOTO BLAS или ATLAS BLAS. После правильной модификации файла make.inc, набрав «сделать», создаст 1) libmagma.a и libmagmablas.a библиотеки в каталоге «Lib» 2) тестирование драйверов в каталоге «тестирование». Таким образом, установить необходимые пакеты: APT-получить установку libatlas базы-DEV liblapack-DEV libf2c2-DEV gfortran Copy make.inc.atlas для make.inc изменения пути CUDA, путь NVCC и путь liblapack.a, и я удалить две ненужные каталоги ссылок. Для получения полной справки, вот оригинальные make.inc.atlas: # /////////////////////////////////// /////////////////////////////////////////// # - MAGMA (версия 1.3 +0,0) - # Univ. Теннесси, Ноксвилл # Univ. Калифорния, Беркли # Univ. Колорадо, Денвер # ноябрь 2012 # ////////////////////////////////////////// //////////////////////////////////// # # GPU_TARGET определяет, для которого GPU вы хотите скомпилировать МАГМА: # "Тесла" (NVIDIA вычислительные возможности 1.x карты) # "Ферми" (NVIDIA вычислительные возможности 2.x карты) # См Http: //developer.nvidia. ком / CUDA-GPUs GPU_TARGET = Ферми CC = GCC NVCC = NVCC ФОРТ = gfortran ARCH = ар ARCHFLAGS = кр RANLIB = ranlib OPTS = -O3 -DADD_ F77OPTS = -O3 -DADD_ FOPTS = -O3 -DADD_ -x F95-cpp- вход NVOPTS = -O3 -DADD_ --compiler-опции -fno-строги ступенчатости -DUNIX LDOPTS = -fPIC -Xlinker -zmuldefs LIB = /home/tomov/LIB/lapack-lite-3.1.1/lapack_LINUX64.a \ - lf77blas -latlas -lcblas -lf2c -lcublas -lm CUDADIR = /usr/local/cuda-3.0 LIBDIR = -L / дома / Тома / LIB / ATLAS / Библиотека / Linux_UNKNOWNSSE2 \ -L / дома / Тома / LIB / CLAPACK-3,1 0,1 / F2CLIBS / \ -L $ (CUDADIR) / lib64 INC = -I $ (CUDADIR) / включить И здесь, мой модифицированный файл, сохраненный в make.inc: # ///////////// ////////////////////////////////////////////////// /////////////// # - MAGMA (версия 1.3.0) - # Univ. Теннесси, Ноксвилл # Univ. Калифорния, Беркли # Univ. Колорадо, Денвер # ноябрь 2012 # ////////////////////////////////////////// //////////////////////////////////// # # GPU_TARGET определяет, для которого GPU вы хотите скомпилировать МАГМА: # "Тесла" (NVIDIA вычислительные возможности 1.x карты) # "Ферми" (NVIDIA вычислительные возможности 2.x карты) # См http://developer.nvidia.com/cuda-gpus GPU_TARGET = Fermi CC = GCC NVCC = / USR /local/cuda-5.0/bin/nvcc ФОРТ = gfortran ARCH = ар ARCHFLAGS = кр RANLIB = ranlib OPTS = -O3 -DADD_ F77OPTS = -O3 -DADD_ FOPTS = -O3 -DADD_ -x F95-CPP-вход NVOPTS = - O3 -DADD_ --compiler-опции -fno-строги ступенчатости -DUNIX LDOPTS = -fPIC -Xlinker -zmuldefs LIB = / USR / Lib / liblapack. а \ -lf77blas -latlas -lcblas -lf2c -lcublas -lm CUDADIR = /usr/local/cuda-5.0 LIBDIR = -L $ (CUDADIR) / lib64 INC = -I $ (CUDADIR) / включают Итак, я бегу и сделать Я получаю эту ошибку. Я применяю решение, предложенное там, и компиляция продолжается до сих пор, до этого момента: сделать [1]: Ввод каталога `/usr/src/magma-1.3.0/testing» НКУ -O3 -DADD_ -DHAVE_CUBLAS -DGPUSHMEM = 200 -I / USR / местные / 5,0-CUDA / включают -I ../ включают -I ../ управления -c -o /usr/local/cuda-5.0/src/fortran.c fortran.o В файл из / USR / местные / 5,0-CUDA / SRC / fortran.c: 67: /usr/local/cuda-5.0/src/fortran_common.h:405:2: ошибка: #error неподдерживаемый Fortran компилятор делает [1]: *** [fortran.o] Ошибка 1 марка [1]: Выход каталог `/usr/src/magma-1.3.0/testing» сделать: *** [тест] Ошибка 2 Что я могу сделать? 0 LIBDIR = -L $ (CUDADIR) / lib64 INC = -I $ (CUDADIR) / включают Итак, я бегу сделать, и я получаю эту ошибку. Я применяю решение, предложенное там, и компиляция продолжается до сих пор, до этого момента: сделать [1]: Ввод каталога `/usr/src/magma-1.3.0/testing» НКУ -O3 -DADD_ -DHAVE_CUBLAS -DGPUSHMEM = 200 -I / USR / местные / 5,0-CUDA / включают -I ../ включают -I ../ управления -c -o /usr/local/cuda-5.0/src/fortran.c fortran.o В файл из / USR / местные / 5,0-CUDA / SRC / fortran.c: 67: /usr/local/cuda-5.0/src/fortran_common.h:405:2: ошибка: #error неподдерживаемый Fortran компилятор делает [1]: *** [fortran.o] Ошибка 1 марка [1]: Выход каталог `/usr/src/magma-1.3.0/testing» сделать: *** [тест] Ошибка 2 Что я могу сделать? 0 LIBDIR = -L $ (CUDADIR) / lib64 INC = -I $ (CUDADIR) / включают Итак, я бегу сделать, и я получаю эту ошибку. Я применяю решение, предложенное там, и компиляция продолжается до сих пор, до этого момента: сделать [1]: Ввод каталога `/usr/src/magma-1.3.0/testing» НКУ -O3 -DADD_ -DHAVE_CUBLAS -DGPUSHMEM = 200 -I / USR / местные / 5,0-CUDA / включают -I ../ включают -I ../ управления -c -o /usr/local/cuda-5.0/src/fortran.c fortran.o В файл из / USR / местные / 5,0-CUDA / SRC / fortran.c: 67: /usr/local/cuda-5.0/src/fortran_common.h:405:2: ошибка: #error неподдерживаемый Fortran компилятор делает [1]: *** [fortran.o] Ошибка 1 марка [1]: Выход каталог `/usr/src/magma-1.3.0/testing» сделать: *** [тест] Ошибка 2 Что я могу сделать?
Jorge Suárez de Lis

Просмотр дополнительных вопросов