На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
    > FORTRAN: необычный GO TO
      Здравствуйте, уважаемые! :)

      Вынужден переводить на понятный мне язык Си некоторую программку на фортране из книги, изданной в Лондоне аж в 1969 году. Фортран этот настолько бородат, что ни в одном русскоязычном учебнике я такого применения GO TO не увидел. Признаюсь, просматривал очень бегло.

      Вот, собственно, код, вызвавший затруднение.

      [ code ]

      GO TO (1,2,1,1,1,1,1,1),K
      1 SOURCE=0.
      RETURN

      2 SOURCE=A(I,J,NW)
      RETURN
      END

      [ /code ]

      Кто-нибудь знает, как это работает?
        Нормальное использование, "вычислимый goto", если мне память не изменяет.

        GO TO (список_меток), n
        Сначала вычисляется выражение n, потом происходит переход к n-ой метке из списка. В твоем случае, только при K = 2 произойдет переход ко второй метке, при K = 1, или 3 .. 8 - переход к метке 1.
          Примерно так и предполагал, но надо было удостовериться.
          Спасибо! :)
            Существует утилита Fortran2C (f2c) -- преобразует Fortran-код в C-листинг.

            А самое быстрое -- скомпилировать Fortran-код в obj и подключить к проекту на C
              Я пробовал использовать f2c, но что-то не получилось. Думаю, надёжнее самому перевести код. Тут всего тысячи полторы-две строчек.. :)

              Дабы не засорять раздел новой темой, задам вопрос тут.

              Что значат записи вроде: I=0. и I=.0 ?

              И самое интересное: WP(X12)=0.0*X12 ?
                Цитата Pers_tmb @
                I=0. и I=.0 ?
                Присвоение вещественного нуля переменной.
                Цитата Pers_tmb @
                WP(X12)=0.0*X12
                Забивается массив нулями, если X12 - это переменная цикла.
                  Цитата
                  WP(X12)=0.0*X12

                  Я так полагаю, что это что-то вроде функции... потому что эта строчка соседствует с оными. Но просто смысла в такой функции нет.

                  Добавлено
                  Цитата NetVir @
                  Цитата Pers_tmb @
                  I=0. и I=.0 ?
                  Присвоение вещественного нуля переменной.

                  Иными словами, если на фортране написано I=5., то это float I=5, а если I=.5, то - float I=0.5?
                    Цитата Pers_tmb @
                    Иными словами, если на фортране написано I=5., то это float I=5, а если I=.5, то - float I=0.5?
                    да

                    Добавлено
                    Цитата Pers_tmb @
                    Но просто смысла в такой функции нет.
                    такое часто бывает. Я лично уже привык.

                    Добавлено
                    покажи описание переменной
                    Цитата Pers_tmb @
                    WP
                    и блок кода, где она учавствует
                      В начале подпрограммы после описания глобальных переменных есть несколько строчек. Одна из них:

                      WP(X12)=0.0*X12

                      В коде же непосредственно есть строчка:

                      A(1,J,NW)=WP(X2(J))/R(J)

                      При этом, переменная X12 нигде не встречается.
                      Сообщение отредактировано: Pers_tmb -
                        в начале подпрограммы есть implicit none?
                          Нет... сначала SUBROUTINE BOUNCT(K)
                          потом переменные COMMON
                          сразу после них вот эти "функции"... причём некоторые гораздо правдоподобнее выглядят: и входных значений побольше, и выражение внутри посложнее.

                          Перепечатывать все долго. С книги пишу.
                            Цитата Pers_tmb @
                            WP(X12)=0.0*X12
                            Это не функция. Это глупое забивание массива. ИМХО.
                            Что за книга?
                              Госмен А.Д., Пан В.М., Ранчел А.К. "Численные методы исследования течений вязкой жидкости". В оригинале издана в 1969 ACADEMIC PRESS - LONDON AND NEW YORK. У нас - 1972 издательство "Мир".


                              Там рядом есть строчка WVW ( DELF,WQ,ROP,DELRO,ETA2 ) = -( DELF/((ETA*DX1)**2)+WQ*(ROP/6.+DELRO/8.))/(ROP/3.+5.*DELRO/24.). Сомневаюсь, что это массив.
                                Цитата NetVir @
                                Цитата Pers_tmb @
                                WP(X12)=0.0*X12
                                Забивается массив нулями, если X12 - это переменная цикла.

                                Меня мучают смутные сомнения:
                                синтаксически - это присваивание X12-му элементу массива WP результата произведения "0.0" yf "X12". Смущает, правда, бессмысленность вычисления этого произведения.
                                Но, насколько я помню, присваивание значений всему массиву производится либо в заголовке оператором
                                DATA WP /0.0*X12/
                                либо в теле без указания индекса в скобках. Т.е. массив записывается как скалярная переменная. Ну еще есть всякие FORALL, но они синтаксически должны отличаться от присваивания элементу массива с заданным индексом.
                                В общем, хотелось бы видеть фрагмент кода побольше.
                                  Цитата andriano @
                                  синтаксически - это присваивание X12-му элементу массива WP результата произведения "0.0" yf "X12"
                                  Так и есть (по идее).
                                  Цитата andriano @
                                  Смущает, правда, бессмысленность вычисления этого произведения.
                                  Не должно так уж сильно смущать. Я и не такое видел. Как показывает практика, "великие мужи" хоть и великие в разрезе своего дела (области науки по своему профилю), но когда доходит дело до прикладного эксперимента (хоть и численного), то реализации оставляют желать лучшего, тем более, когда работы оформляются самими разработчиками численных методов. Обычно, такую работу перекладывают на плечи Ph.D. или чаще Ph.D. Candidate, которые уже более грамотно "прикладывают" работы своего начальства со знанием ЯП как минимум.

                                  Добавлено
                                  Цитата Pers_tmb @
                                  Там рядом есть строчка WVW ( DELF,WQ,ROP,DELRO,ETA2 ) = -( DELF/((ETA*DX1)**2)+WQ*(ROP/6.+DELRO/8.))/(ROP/3.+5.*DELRO/24.). Сомневаюсь, что это массив.
                                  И? В чем повод сомнения "WQ" - это не "WP".
                                  Если найду книгу, то смогу дать более подробно консультацию.
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0370 ]   [ 16 queries used ]   [ Generated: 25.04.24, 04:17 GMT ]